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

302 天前
 WilliamColton

使用的 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 表示程序正常结束
}

3727 次点击
所在节点    C
31 条回复
lff0305
301 天前
在 Linux 下用 GCC 测试了下没有发现问题

这个问题是否和 Clion 的 Console 有关系?
WilliamColton
301 天前
@sbldehanhan #16 仔细一想确实应该如此
@CEBBCAT #18 嗯嗯,谢谢您真诚的建议! :)
@lff0305 #21 就是 CLion 的 Console 有问题!我在同学电脑上也试了一下,依旧是这个问题,但是直接运行他编译出来的程序就不会这样。感谢提醒!!!
@araraloren #20 你这个才是正解😊
我会向 JetBrains 写邮件反馈的!谢谢各位!
nevermoreluo
301 天前
同 Clion2023.3.4 ,mingw11 没复现
建议自己断点 debug 找找吧,这里总共也没多少数
WilliamColton
301 天前
@nevermoreluo #23 但是我在同学电脑的 CLion 上都可成功复现,应该是我和你方法不一样?
然后我已经设断点找过了,代码一运行到那里就 num 就变成 0 ,进去 scanf 也没看出啥有用的信息来,再进一层就是汇编了,这个是真看不懂(能力有限,大一新生,望谅解)
我等会再找一个同学安装 CLion 试试
同时下面两张图是我的方法
cnbatch
301 天前
第九行那个 scanf ,双引号内有个空格,但你原贴给出的代码,这一行的双引号内没空格
cnbatch
301 天前
还有第 12 行也是一样

建议好好检查下空格状况
WilliamColton
301 天前
@cnbatch #25 这空格不影响结果

cnbatch
301 天前
我自己用 Windows 11 + VS2022 试了下,没法复现错误,最终输出是 1
在 FreeBSD 14 + Clang 16 试了下,也是没问题,最终输出还是 1
Linux 就不试了,前面已经有人测试过

个人建议,不要死磕 CLion 控制台,而是改用常规环境。
鬼知道 CLion and/or 它自带的 MinGW 是不是有 bug 。

尤其像这次,正常命令行环境运行测试程序没任何问题,CLion 控制台一用就出错,那只能是 CLion 的锅。

至于常规环境,例如:
Windows: MSVC 最新版,直接用 Visual Studio 即可
Linux: 编译器 GCC 或 Clang 均可,IDE 随意
BSD: 编译器用系统自带的,IDE 随意
macOS: Apple Clang

尤其是 Windows ,用 Visual Studio 反倒最稳妥
WilliamColton
301 天前
@cnbatch #28 好的,感谢指点:)
nevermoreluo
300 天前
单纯有点好奇你的 for(;;) 里面是什么

下面属于根据结果瞎猜了

就是兄弟咱不能写出直接往标准输出里面写 0 的东西吧。。。。

```
printf("min: %d", min); // 打印最小值到标准输出
fflush(stdin);
for (;;){

write(1, "0", 1); // 这样的话对句柄标准输出直接写的这个 0 会先输出,printf 如果不 fflush(stdout)的话要等程序退出才会打印 就会在后面
scanf(" %d", &n);
if (n == -1){ break; }
}
```

```
# Clion Console
8

1 9 2 6 90 8 1 7
0-1 // 0 是 write 函数输出的,-1 是输入赋值给 n 的
min: 1
```
araraloren
300 天前
@nevermoreluo Do not write`fflush(stdin)`, it's a bad practice.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1026058

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX