【问题标题】:Splitting a string into integers将字符串拆分为整数
【发布时间】:2015-03-24 14:18:18
【问题描述】:

对于我的第一个任务,我使用fgets()stdin 读取字符串。所以我在终端上输入1234567890 并将字符串存储到一个名为str 的变量中。现在我想拆分数字并执行加法。在这种情况下,总和将是 55,因为 1+2+3+4+5+6+7+8+9+0 = 55

我该怎么做?

到目前为止我的代码

#include <stdio.h>
#include <string.h>
int main(void){

char str[100];

printf("Please enter the 10 digit number \n");
fgets(str, 10, stdin);

//Separate the digits


//calculate their sum
int sum =..............

//print out the sum
printf("the sum of the digits is: %s", sum);

return(0);
}

【问题讨论】:

  • 初始化一个 'sum' 变量为 0。迭代字符串直到结束。将每个 ASCII 字符转换为 int。将其添加到“总和”变量中。

标签: c string


【解决方案1】:

方法一:

如果您确定要计算个位整数,则可以使用

  • 数组索引以从输入字符串中读取逐位值。
  • 根据所需的编码(主要是ASCII)将char 值转换为对应的int
  • 定义一个int 变量,比如res 来保存总和。执行加法并将结果存储到sum
  • 循环直到达到终止空值。
  • 使用%d 格式说明符打印出sum

方法2:

或者,您可以执行类似的操作(再次假设,个位整数

  • 使用strtol() 将整个字符串 转换为整数。在这种情况下,您必须检查错误。
  • 定义一个 int 变量,例如 res 来保存总和。
  • 10进行模运算(%0) on the converted interger value to take out the last digit. add and store that inres`
  • 将转换后的整数值除以10 (p /= 10)。
  • 继续第 2 步,直到结果为 0
  • 当转换后的整数值变为0时,打印res

P.S - 仅供参考,基于某些分隔符拆分字符串的常用方法是使用strtok()

【讨论】:

    【解决方案2】:

    既然您确定字符串将包含数字,请从'0' 中减去每个字符以获得它们的数值。

    int sum = 0;
    fgets(str, sizeof str, stdin);
    char *s = &str;
    while(*s != '\0') {
        sum += *(s++) - '0';
    }
    
    printf("the sum of the digits is: %d", sum);
    

    【讨论】:

      【解决方案3】:

      首先,确保使用scanf 只读取数字,如下所示:

      char str[11]; // 10 digits plus \0 terminator
      printf("Please enter the 10 digit number \n");
      scanf("%10[0-9]", str);
      

      现在您可以通过索引str 并减去数字零的代码来逐位遍历数字,如下所示:

      int nextDigit = str[i] - '0';
      

      这应该足以让您通过在其周围添加for 循环来完成解决方案。确保使用%d 打印sum,而不是像在代码示例中那样使用%s

      【讨论】:

      • 我认为我们不应该通过告诉人们更喜欢 scanf 而不是 fgets 来引导人们误入不良编程习惯。
      • @Lundin 在这种特殊情况下,scanf 在您能说出的每一个方面都提供了明显优于fscanf 的替代方案,同时保持同样的安全。当然,它提供了更多的滥用场所,但它的用途非常安全,每个从业者都必须学习。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多