一个简单(奇怪)的 C 语言问题

WilliamColton · 2024-3-22 12:33:46 · 298 次点击
使用的 IDE 是 CLion ,编译器是其自带的 `MinGW 11.0 w64`

下面的代码使用 chatgpt 加了注释,主要的问题是:

在直接给定输入
```
8

1 9 2 6 0 8 1 7
```
时,结果为 0.

而再次给定输入
```
8

1 9 2 6 90 8 1 7
```
时,结果还是 0.

而手动一个一个输入则正常显示 1.

虽然描述的很离奇,但是确实是这样,即:第一次的结果会影响第二次的结果,使之变成第一次的结果

我问了我们教 C 语言的老师,连他也不知道怎么回事,说可能是 CLion 的问题,但是这个答案并不能令我信服,

故来寻求各位 V 友帮助

求各位 V 友解答 QAQ

代码如下:
```
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n); // 从标准输入中读取一个整数,存储到变量 n 中

    int min;
    scanf("%d", &min); // 假设输入的第一个数为最小值,存储到变量 min 中
    int num;
    for (int i = 1; i < n; i++) { // 循环读取剩余的 n-1 个整数
        scanf("%d", &num); // 从标准输入中读取一个整数,存储到变量 num 中
        printf("%d\n", num); // 将读取的整数打印到标准输出,以换行符结束

        if (num < min) { // 检查当前读取的整数是否比最小值小
            min = num; // 更新最小值为当前读取的整数
        }
    }
    printf("%d", min); // 打印最小值到标准输出

    return 0; // 返回 0 表示程序正常结束
}

```
举报· 298 次点击
登录 注册 站外分享
18 条回复  
NessajCN 小成 2024-3-22 12:44:37
没有复现,建议检查自身环境
PTLin 小成 2024-3-22 12:49:52
这种问题自己打个断点调试一下比来这里问更快的。
ben666 小成 2024-3-22 12:54:31
遇到问题
1. 单步调试
2. printf 打印调试

另外,注意一下 C 代码风格与规范,参考:
1. linux kernel 规范: https://www.kernel.org/doc/html/v4.10/process/coding-style.html
2. nginx 规范: https://nginx.org/en/docs/dev/development_guide.html#code_style

也可以参考 https://github.com/baidu/dperf/  的代码风格
GeruzoniAnsasu 小成 2024-3-22 12:55:31
奇怪问题通常是蠢原因。 比如开了两个窗口(真实经历)
mightybruce 小成 2024-3-22 13:02:12
代码结果我没有复现, 给你一点提示
scanf() 并不是直接让用户从键盘输入数据,而是先检查缓冲区,处理缓冲区中的数据

scanf() 的这些特性都是有章可循的,其根源就是行缓冲区。

当遇到 scanf() 函数时,程序会先检查输入缓冲区中是否有数据:

如果没有,就等待用户输入。用户从键盘输入的每个字符都会暂时保存到缓冲区,直到按下回车键,产生换行符\n ,输入结束,scanf() 再从缓冲区中读取数据,赋值给变量。
如果有数据,那就看是否符合控制字符串的规则

如果能够匹配整个控制字符串,那最好了,直接从缓冲区中读取就可以了,就不用等待用户输入了。
如果缓冲区中剩余的所有数据只能匹配前半部分控制字符串,那就等待用户输入剩下的数据。
smdbh 小成 2024-3-22 13:02:21
scanf 是回车有效吧,如果是一行输入,就是 ```scanf("%d%d%d %d%d%d%d%d", &min[0],&min[1], .... &min[7], );```  前后都是 8 个
bugcoder 小成 2024-3-22 13:12:35
你在 return 一句前面加上 fflush(stdin); 把输入缓存清空一下。 一般 scanf 出问题都是缓存的问题。
GenericT 小成 2024-3-22 13:12:36
Clion 有个运行配置有个“重定向输入自”,你是不是在里面放东西了
aa514758835 小成 2024-3-22 13:30:47
把中间文件删干净重新编译把,我有时候也会遇到明明是 false 但是走了 true 分支的情况
12下一页
返回顶部