从鱼油的截图和代码中可以看出,问题在于
如何处理C程序中的输入和变量。
使用scanf_s函数的输入处理:scanf_s函数用于读取带有缓冲区大小的字符数组,你已经正确指定了缓冲区大小,但用它来读取单个字符并存入char变量是不合适的。
当你声明char i;然后使用scanf_s("%s", &i, 20);时,这样的用法是错误的,因为%s期望得到一个字符串(字符数组),而不是单个字符。
这种不匹配可能导致内存损坏,因为它写入的数据超过了char能够存储的范围。
正确的用法
要安全地读取单个字符,应该使用%c替代%s并移除大小参数。
正确的代码应该是scanf_s("%c", &i, 1);。这样可以安全地读取一个字符,确保没有溢出。
你的第二个截图显示了Visual Studio中的编译器设置。
由于项目设置中启用了运行时检查或安全增强功能,如基本运行时检查或安全检查,如果存在任何风险的内存操作(如原始代码中的操作),程序可能会运行失败。
这里是修正后的代码:
#include <stdio.h>
int main() {
int temp = 0;
char i;
printf("请输入一个数字:");
for (;;) {
scanf_s("%c", &i, 1); // 正确的方式,安全地读取单个字符
if (i >= '0' && i <= '9') {
temp += i - '0';
} else {
break; // 如果输入不是数字,则中断循环
}
printf("请输入一个数字:");
}
printf("\n共:%d", temp);
return 0;
}
这个修改应该会解决运行时错误,因为它正确地处理了字符输入并避免了缓冲区溢出。