鱼C论坛

 找回密码
 立即注册
查看: 449|回复: 5

[已解决]小白来了.6

[复制链接]
发表于 2024-8-18 14:05:14 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>

int main()
{
        int temp = 0;
        char i;
        printf("请输入一个数字:");
        for (;;)
        {
                scanf_s("%s", &i,20);

                if (i <= '9' && i >= '0')
                {
                        temp += i - '0';
                }
                else
                {
                        break;
                }
                printf("请输入一个数字:");
        }
        printf("\n共:%d", temp);
        return 0;
}

上面代码再运行结束,打印共:()的时候会报错,如下
javascript:;
如下处理后就不会报错了:
javascript:;
不知道为什么,是超纲的内容吗
最佳答案
2024-8-18 14:39:34
从鱼油的截图和代码中可以看出,问题在于如何处理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;
}
这个修改应该会解决运行时错误,因为它正确地处理了字符输入并避免了缓冲区溢出。

处理

处理

报错

报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-8-18 14:16:02 | 显示全部楼层
哈哈,小白来了!我看到你写的代码有几个小问题,我们一起来看看怎么修复它。这个代码的目的是要让用户输入多个数字,直到输入的不是数字为止,然后计算这些数字的总和对吧?

首先,`scanf_s("%s", &i, 20);`这里 `&i` 是不对的,因为 `i` 是一个 `char` 类型,而 `scanf_s` 用于读取字符串时应该用一个字符数组来保存。可以改成一个字符数组,比如 `char str[20];`。

然后,判断语句 `if (i = '0')` 中使用了赋值运算符 `=`,而不是比较运算符 `==`。这样会让 `if` 的条件一直为真并且不断修改 `i` 的值。

最后,`temp += i - '0';` 这样的写法是对的,但是得确保 `i` 是 `'0'` 到 `'9'` 之间的字符,否则可能会产生意想不到的结果。

下面是一个修改后的版本:
#include <stdio.h>

int main()
{
    int temp = 0;
    char i;

    printf("请输入一个数字(输入非数字结束):");
    while (1)
    {
        scanf(" %c", &i); // 读取一个字符,注意空格前缀处理前面的换行

        if (i >= '0' && i <= '9') // 判断是不是0-9之间的字符
        {
            temp += i - '0';
        }
        else
        {
            break; // 如果不是数字就退出循环
        }
        printf("请输入一个数字(输入非数字结束):");
    }
    
    printf("\n共:%d\n", temp);
    return 0;
}

在这个版本中:
1. 我们使用了 `scanf(" %c", &i);` 来读取单个字符,并加上了一个空格,以处理可能的换行符。
2. 使用了正确的比较运算符 `>=` 和 `<=` 来检查是否是数字字符。
3. 输出格式调整了一下,让输出更清晰。

试试这个代码,看能不能顺利运行并完成任务!如果还有问题,随时问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-18 14:39:34 | 显示全部楼层    本楼为最佳答案   
从鱼油的截图和代码中可以看出,问题在于如何处理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;
}
这个修改应该会解决运行时错误,因为它正确地处理了字符输入并避免了缓冲区溢出。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-18 16:18:17 | 显示全部楼层
不二如是 发表于 2024-8-18 14:39
从鱼油的截图和代码中可以看出,问题在于如何处理C程序中的输入和变量。

使用scanf_s函数的输入处理:sc ...

好的谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-18 16:18:36 | 显示全部楼层
FishC 发表于 2024-8-18 14:16
哈哈,小白来了!我看到你写的代码有几个小问题,我们一起来看看怎么修复它。这个代码的目的是要让用户输入 ...

谢谢小鱼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-19 18:50:06 | 显示全部楼层
不客气,小白!我可是FishC的计算机教育专家小鱼,为你解答问题是我的荣幸!嘿嘿~ 还有问题尽管放马过来,咱们一起学习,一起进步!加油!(^▽^)

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 17:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表