C字符串、atoi函数和整型数组

3

我想要做以下事情:

  1. 将输入的字符串转换为整数。
  2. 使用指针和for循环计算整数数组的总和。
  3. 如果用户什么都不输入,只按下回车键,则程序会打印答案。

我的代码:

int main(void)
{
    int i, a[10], sum = 0;
    int * b;
    b = a;
    char c[10];
    printf ("Please enter some numbers:\n");

    for(i = 0 ; i < 10 ; i++)
    {
        (void) fgets(c, (sizeof * b), stdin);
        if(c[0] == '\n')
        {
            break;
        }
        *(b + i) = atoi(c);
        sum = sum + *(b + i);
    }
    printf ("sum : %d \n", sum);

    return 0;
}

有些奇怪的事情我无法理解。

仅适用于两位数时才有效:

$Please enter some numbers:
$32
$31
$1
$
$sum:64

如果我输入三个数字,它会直接输出结果:

$Please enter some numbers:
$123
$sum:123


$Please enter some numbers:
$12
$123
$sum:135

如果有超过三个数字,程序将会把剩下的数字相加。
$Please enter some numbers:
$2123
$
$sum:215    //The sum became 212+3.



$Please enter some numbers:
$12345
$11
$
$sum:179    //The sum became 123+45+11.



$Please enter some numbers:
$123456
$sum:579    //If the number of digits is a multiple of 3, this program directly prints sum(=123+456).

如果有人能帮助我,我会非常感激。谢谢您阅读这个漫长的问题。

2
fgets(c,sizeof* b,stdin); --> fgets(c,sizeof(c),stdin); - LPs
你为什么要读取b的值的大小?sizeof* b将被转换为4或2,这取决于您的系统 - 无论如何 - 这不是您的意图。您应该读取sizeof(c) - 10。 - Zach P
糟糕!我太粗心了。非常感谢! - Xenoturbellian
2个回答

5

这是错误的:

fgets(c,sizeof* b,stdin);

sizeof *b表示一个int的大小(通常为4),你需要有足够的空间来容纳10个字符:

fgets(c,sizeof c,stdin);

请注意,根据 atoi 的文档,在这种具体情况下不需要去除 fgets 后的换行符:

字符串可以包含整数数字后的其他字符,这些字符将被忽略,不会影响此函数的行为。


3
fgets(c,sizeof(c),stdin);

size_t n = strlen(c);

if(n>0 && c[n-1] == '\n')
{
   c[n-1] = '\0';
}

fgets()函数会包含一个换行符号,你需要去掉它。

然后将字符串转换为整数,但你不知道有多少个整数。

   char *p;

    p = strtok(c," ");
    while(p != NULL)
    {
       b[i++] = atoi(p);
       p = strtok(c, NULL);
    }

对整数进行加法运算,并在访问数组之前确保检查 i<10

如果您的终止条件是 \n,请先除去换行符再进行检查。


1
或者使用 strcspn ==>>> p[strcspn(p, "\n")] = 0; - Michi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接