关于#c语言#的问题:为什么我输入的正数scanf会读取到一个负数

为什么我输入的正数scanf会读取到一个负数?

img


(Dev-C++软件)

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7559831
  • 你也可以参考下这篇文章:关于c语言的scanf用来读取字符的一些总结
  • 除此之外, 这篇博客: C语言中scanf函数的用法中的 一、概述 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:
    1. scanf的功能:通过键盘给程序中的变量赋初值,其原型为
    #include <stdio.h>
    int scanf(const char *format,...);
    
    1. 用法:scanf(“输入控制符”,&输入参数);

    输入控制符和输出控制符一样。是操作系统用来转化从键盘上接收来的字符数据。

    例:键盘上输入123,表示的并不是数字123,而是字符’1’、‘2’、‘3’,%d即是将从键盘上输入的合法字符转化成一个十进制数字。

    &是一个取地址符,加上变量名后表示“变量的地址”,&i就表示变量i的地址,相当于将数据存入以变量i的地址为地址的变量中

  • 您还可以看一下 陈立臣老师的老陈的C语言从入门到入行课程中的 scanf混合输入的那些坑小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    在C语言中,使用scanf函数读取输入时可能会出现读取到负数而非正数的情况。这可能是由于以下原因导致的:

    1. 使用scanf函数读取一个整数时,如果输入的内容不符合整数格式,会导致scanf函数读取失败,这时scanf函数返回0。如果没有将返回值检查为0的情况处理,下次循环时scanf函数会尝试读取之前输入的内容,导致读取到负数。解决方法是在读取整数后,检查scanf函数的返回值,如果返回0,则说明输入格式错误,可以利用getchar函数将错误的输入从输入缓冲区中清除。
    #include <stdio.h>
    
    int main()
    {
        int num;
        while (scanf("%d", &num) != EOF)
        {  
            if (scanf("%d", &num) == 0) {
                getchar();
                continue;
            }
    
            if (num > 0) {
                printf("输入的数字是正数:%d\n", num);
            } else {
                printf("输入的数字是负数:%d\n", num);
            }
        }
        return 0;
    }
    
    1. 另一个可能的原因是scanf函数会忽略换行符和空格符,这意味着当你在输入正数后按下回车时,scanf函数会继续读取换行符,而不会停止读取。解决方法是使用getchar函数来消耗掉输入缓冲区中的换行符。
    #include <stdio.h>
    
    int main()
    {
        int num;
        printf("请输入一个正数:");
        scanf("%d", &num);
        getchar(); // 消耗掉输入缓冲区中的换行符
        if (num > 0) {
            printf("输入的数字是正数:%d\n", num);
        } else {
            printf("输入的数字是负数:%d\n", num);
        }
        return 0;
    }
    

    以上是两种可能的解决方案,根据具体的情况选择适合的方法来解决问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

太大了 超范围

int的取值范围为: -2^31——2^31-1,即-2147483648——2147483647