c - 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 也只运行一次?
解决方案
这可能是因为变量的值n
被越界写入破坏了。
您的缓冲区stat
没有足够的大小来存储 3 个字符的字符串,因为没有空间来存储终止空字符。
为了安全起见,增加缓冲区大小并限制要读取的字符数。
检查读取是否成功将使其更安全。
char stat[3];
scanf ("%s", stat);
应该
char stat[4];
if (scanf ("%3s", stat) != 1) return 1;
推荐阅读
- python - 给定一维和一个常数,有效地创建二维 numpy 数组
- amazon-web-services - AWS SSO 外部 SAML 身份提供程序无效的 MFA 凭证错误
- stm32 - STM32F103上升下降沿触发中断的触发电压是多少?
- javascript - 在使用 AJAX 更改另一个元素后使用 jQuery 更改元素的 CSS
- javascript - 盒子的大小不与照片大小固定
- typescript - 打字稿:覆盖超类方法而无需知道超类方法签名
- sql-server - 在 Docker 上使用 dbup 部署 SQL Server 数据库
- python - 运行 python 程序时出现 Crontab 错误
- php - 在静态函数中获取静态类的属性?
- vba - 如何对用户表单填充的数据进行顺序编号