从鱼油的截图和代码中可以看出,问题在于
如何处理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;
- }
复制代码
这个修改应该会解决运行时错误,因为它正确地处理了字符输入并避免了缓冲区溢出。