

























这是一个创建于 812 天前的主题,其中的信息可能已经有所发展或是发生改变。
使用的 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 表示程序正常结束
}
1 NessajCN 2024 年 3 月 22 日没有复现,建议检查自身环境 |
2 PTLin 2024 年 3 月 22 日这种问题自己打个断点调试一下比来这里问更快的。 |
7 mightybruce 2024 年 3 月 22 日代码结果我没有复现, 给你一点提示 scanf() 的这些特性都是有章可循的,其根源就是行缓冲区。 当遇到 scanf() 函数时,程序会先检查输入缓冲区中是否有数据: 如果没有,就等待用户输入。用户从键盘输入的每个字符都会暂时保存到缓冲区,直到按下回车键,产生换行符\n ,输入结束,scanf() 再从缓冲区中读取数据,赋值给变量。 如果能够匹配整个控制字符串,那最好了,直接从缓冲区中读取就可以了,就不用等待用户输入了。 |
8 smdbh 2024 年 3 月 22 日scanf 是回车有效吧,如果是一行输入,就是 ```scanf("%d%d%d %d%d%d%d%d", &min[0],&min[1], .... &min[7], );``` 前后都是 8 个 |
9 bugcoder 2024 年 3 月 22 日你在 return 一句前面加上 fflush(stdin); 把输入缓存清空一下。 一般 scanf 出问题都是缓存的问题。 |
10 GenericT 2024 年 3 月 22 日Clion 有个运行配置有个“重定向输入自”,你是不是在里面放东西了 |
12 aa514758835 2024 年 3 月 22 日把中间文件删干净重新编译把,我有时候也会遇到明明是 false 但是走了 true 分支的情况 |
13 GenericT 2024 年 3 月 22 日建议把整个 workspace 打包上传,不然没法判断 |
14 yolee599 2024 年 3 月 22 日@smdbh #8 正解,按照 OP 给出的代码,应该这样输入: 而不是这样: |
15 PTLin 2024 年 3 月 22 日在纯净的终端里用 mingw 的 gcc/clang 编译然后运行,然后复现你的问题,整理成流程最后再来问吧。要不现在这样也没人可以复现,问也没意义。 |
16 sbldehanhan 2024 年 3 月 22 日程序两次运行之间没有任何联系。所以,第一次影响第二次是不可能发生的。遇到问题先从自己身上找原因,相信计算机比人靠谱。 |
17 tool2d 2024 年 3 月 22 日用 mingw gcc 编译了一下,没办法复现,结果倒是对的。 |
18 CEBBCAT 2024 年 3 月 22 日尝试使用输入重定向来解决,我怀疑你复制粘贴的字符掺杂了不可见字符之类的。 例如,echo '8\n\n1 2 3\n' > t; cat t | od -xa; cat t | ./a.exe 已经会用调试器了啊,很好,这些奇奇怪怪的问题可以追查,相信最后要不发现哭笑不得的错误,要不然就是对计算机有更多了解。或者也可以切换到其他平台比如 Linux macOS 。 另外,论坛里面有很多半吊子的,网上也是,有的时候别太信。小马过河,尽量规避因为别人的鼠目寸光给自己带来的误导 |
19 MoYi123 2024 年 3 月 22 日如果要在 clion 的 terminal 里输入, 推荐把 Emulate terminal in the output console 打开 |
20 araraloren 2024 年 3 月 22 日@yolee599 `scanf` can handle the input correctly, you don't need enter line by line. |
21 lff0305 2024 年 3 月 22 日在 Linux 下用 GCC 测试了下没有发现问题 这个问题是否和 Clion 的 Console 有关系? |
23 nevermoreluo 2024 年 3 月 22 日同 Clion2023.3.4 ,mingw11 没复现 |
24 WilliamColton 2024 年 3 月 22 日@nevermoreluo #23 但是我在同学电脑的 CLion 上都可成功复现,应该是我和你方法不一样? |
25 cnbatch 2024 年 3 月 22 日第九行那个 scanf ,双引号内有个空格,但你原贴给出的代码,这一行的双引号内没空格 |
28 cnbatch 2024 年 3 月 23 日我自己用 Windows 11 + VS2022 试了下,没法复现错误,最终输出是 1 个人建议,不要死磕 CLion 控制台,而是改用常规环境。 尤其像这次,正常命令行环境运行测试程序没任何问题,CLion 控制台一用就出错,那只能是 CLion 的锅。 至于常规环境,例如: 尤其是 Windows ,用 Visual Studio 反倒最稳妥 |
30 nevermoreluo 2024 年 3 月 23 日单纯有点好奇你的 for(;;) 里面是什么 下面属于根据结果瞎猜了 就是兄弟咱不能写出直接往标准输出里面写 0 的东西吧。。。。 ``` write(1, "0", 1); // 这样的话对句柄标准输出直接写的这个 0 会先输出,printf 如果不 fflush(stdout)的话要等程序退出才会打印 就会在后面 ``` 1 9 2 6 90 8 1 7 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。