每当我将变量声明为 char 并将其扫描为字符串“%s”时,我的输出控制台就会崩溃。这是代码
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main()
{
char a[20];
int i;
printf("Enter a name ");
scanf("%s",&a);
for(i=0;i<strlen(a);i++)
{
a[i] = toupper(a[i]);
i++;
printf("%s\n",toupper(a[i]));
}
return 0;
}
最佳答案
for
循环体内的第二个 i++;
可能会导致索引指向偏离一的位置,printf("%s\n",toupper(a[i]));
将超出调用 undefined behavior 的访问权限.
您可以从循环体内删除 i++
。
接下来,toupper(a[i])
返回一个 int
,它对于 %s
格式说明符无效,它再次调用 UB .
也就是说,
为防止输入过长而导致缓冲区溢出,最好使用
scanf()
限制输入长度,您不需要传递数组的地址,只需传递数组名称即可
所以,总的来说,你应该写
scanf("%19s",a);
关于代码块输出控制台已停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39445813/