首页 > 解决方案 > scanf() 在 for 循环中只运行一次

问题描述

我是 C 编程的新手。我试图在循环中使用 scanf 解决一个问题,但问题是 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 也只运行一次?

标签: c

解决方案


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

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

为了安全起见,增加缓冲区大小并限制要读取的字符数。

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

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

应该

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

推荐阅读