scanf()在for循环内仅运行一次

时间:2020-05-04 14:32:51

标签: c

我是C编程的新手。我正在尝试使用scanf in loop解决一个问题,但是问题是scanf在循环内仅运行一次。我的代码是:

#include <stdio.h>
#include <string.h>

int main()
{
    int n;
    int x=0;

    scanf("%d", &n);
    for (int i=1; i<=n; i++)
    {
         char stat[3];
         scanf ("%s", stat);
        if (strcmp(stat, "X++")==0)
            x++;
        else if (strcmp(stat,"++X")==0)
            x++;
        else if (strcmp (stat, "--X")==0)
            x--;
        else if (strcmp(stat, "X--")==0)
            x--;
    }
    printf ("%d", x);

    return 0;
}

为什么即使n为2、3或其他任何值,scanf也只运行一次?

1 个答案:

答案 0 :(得分:3)

这可能是因为越界写破坏了变量n的值。

您的缓冲区stat的大小不足以存储3个字符的字符串,因为没有空间来存储终止空字符。

增加缓冲区大小并限制要读取的字符数,以确保安全。

检查读取是否成功将使其更安全。

         char stat[3];
         scanf ("%s", stat);

应该是

         char stat[4];
         if (scanf ("%3s", stat) != 1) return 1;