惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy International News Feed
Martin Fowler
Martin Fowler
The GitHub Blog
The GitHub Blog
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research
WordPress大学
WordPress大学
宝玉的分享
宝玉的分享
Vercel News
Vercel News
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
I
InfoQ
Y
Y Combinator Blog
月光博客
月光博客
小众软件
小众软件
有赞技术团队
有赞技术团队
A
About on SuperTechFans
U
Unit 42
C
CXSECURITY Database RSS Feed - CXSecurity.com
Know Your Adversary
Know Your Adversary
NISL@THU
NISL@THU
P
Proofpoint News Feed
V
Vulnerabilities – Threatpost
G
Google Developers Blog
V
V2EX
V
V2EX - 技术
Forbes - Security
Forbes - Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
GbyAI
GbyAI
The Cloudflare Blog
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tailwind CSS Blog
人人都是产品经理
人人都是产品经理
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
M
MIT News - Artificial intelligence
量子位
Microsoft Security Blog
Microsoft Security Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园_首页
Recorded Future
Recorded Future
F
Full Disclosure
Hacker News - Newest:
Hacker News - Newest: "LLM"
Cyberwarzone
Cyberwarzone
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
PCI Perspectives
PCI Perspectives
H
Hacker News: Front Page
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
C
Check Point Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org

C

各位大佬, C 語言該怎麼練習啊 分享一个代码优化导致的死循环 人再笨还能写不出内存安全的 C? 想念 C C11 的 _Generic,现实当中用得多不多?(尤其是公司项目) 坑爹的 GBK:大家都应该去用 UTF-8 分享一个用 AI 学习 C 语言的例子 一个简单的 C 程序,但是不明白区别在哪里 我这段 C 代码可以在编译时候输出结构体的大小,你们还有什么好点子, show me the code! 这段话是否正确?「取余这个运算,只有 Python 是对的。当初 C 这个老师教错了,那么一大票学生也就只敢跟着老师错。只有 Python 敢于站出来坚持正确答案。」 C 中可变参数如何直接传递到 printf() C 的内存打印实现 函数能否实现透传不定长度参数,最终由 printf 打印 请大佬帮忙修改一份 elf 文件里的数值 Linux 上 C 的程序遇到个异常退出问题,局部变量大小有限制?? C 语言新手求助:如何在 vscode 中使用第三方库? 将资源嵌入到可执行文件中并保持目录结构 一个简单实用的 C 工程示例, 附简洁的 Makefile 关于 C 语言的相关问题 轮子更新: C/C++ 跨平台小工具库 为什么下列程序进行的是无符号乘法? 用 riscv64- Linux -gnu-gcc 编译的 c 文件为啥能在 x8664 下运行? char *s = "0123"和 char s[] = "0123"的区别 有人能完整地解释一下 int (*daytab) [13]和 int *daytab[13]吗 在 c 语言中, int a;是 declaration 还是 definition c 语言中打印指针的值打印的是 OS 分配的虚拟地址的值吗?要怎么知道 OS 给这个 c 程序进程分配的虚拟地址的大小呢? gcc 是怎么找到 system 函数的定义(实现)的? 用 C 实现轻量级表达式完成策略定制化和模板内容生成 c 语言是如何给汉字编码的? 还是不太理解 C 静态库和动态库? 开源 C 库 bfdev: MPI 大数运算 C 语言中的面向切面编程(AOP) 网络语言污染/扭曲专业术语名词——《为什么 c 语言这么抽象?》 C 语言函数资源开销可观测性 C 语言用户态函数可观测性 在 C 中,如何正确拷贝字符串 c 语言中自定义 section 段问题请教 C 语言的源码过滤功能的工具 求助 libcurl 的 curl_easy_pause() 使用方法 各位有什么深入了解 C 语言的书嘛? 不熟悉 cmake,请教一下多模块项目的 cmake 写法 大家有没有值得推荐的 c 语言的开源项目,用来学习或者贡献的。 求帮忙看一下这个 C 代码为什么会段错误! int 型返回值所能表达的内容极限 刚刚突然感受到了 C 语言指针的神奇之处 开源 C 语言库 Melon 之模块选择性编译 这年头搞 c 还有前途吗 看看我的 leetcode 第 151 题目 反转字符串 百变开源 C 语言库日志模块 最好用的 C 语言 JSON 解析器
一个简单(奇怪)的 C 语言问题
WilliamColton · 2024-03-22 · via C

这是一个创建于 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 表示程序正常结束
}

NessajCN

1

NessajCN      2024 年 3 月 22 日   ❤️ 1

没有复现,建议检查自身环境

PTLin

2

PTLin      2024 年 3 月 22 日   ❤️ 1

这种问题自己打个断点调试一下比来这里问更快的。

mightybruce

7

mightybruce      2024 年 3 月 22 日   ❤️ 1

代码结果我没有复现, 给你一点提示
scanf() 并不是直接让用户从键盘输入数据,而是先检查缓冲区,处理缓冲区中的数据

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

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

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

如果能够匹配整个控制字符串,那最好了,直接从缓冲区中读取就可以了,就不用等待用户输入了。
如果缓冲区中剩余的所有数据只能匹配前半部分控制字符串,那就等待用户输入剩下的数据。

smdbh

8

smdbh      2024 年 3 月 22 日

scanf 是回车有效吧,如果是一行输入,就是 ```scanf("%d%d%d %d%d%d%d%d", &min[0],&min[1], .... &min[7], );``` 前后都是 8 个

bugcoder

9

bugcoder      2024 年 3 月 22 日

你在 return 一句前面加上 fflush(stdin); 把输入缓存清空一下。 一般 scanf 出问题都是缓存的问题。

GenericT

10

GenericT      2024 年 3 月 22 日

Clion 有个运行配置有个“重定向输入自”,你是不是在里面放东西了

aa514758835

12

aa514758835      2024 年 3 月 22 日

把中间文件删干净重新编译把,我有时候也会遇到明明是 false 但是走了 true 分支的情况

GenericT

13

GenericT      2024 年 3 月 22 日

建议把整个 workspace 打包上传,不然没法判断

yolee599

14

yolee599      2024 年 3 月 22 日

@smdbh #8 正解,按照 OP 给出的代码,应该这样输入:
8\n
1\n
9\n
2\n
6\n
0\n
8\n
1\n
7\n

而不是这样:
8\n
1 9 2 6 0 8 1 7\n

PTLin

15

PTLin      2024 年 3 月 22 日   ❤️ 1

在纯净的终端里用 mingw 的 gcc/clang 编译然后运行,然后复现你的问题,整理成流程最后再来问吧。要不现在这样也没人可以复现,问也没意义。

sbldehanhan

16

sbldehanhan      2024 年 3 月 22 日

程序两次运行之间没有任何联系。所以,第一次影响第二次是不可能发生的。遇到问题先从自己身上找原因,相信计算机比人靠谱。

tool2d

17

tool2d      2024 年 3 月 22 日

用 mingw gcc 编译了一下,没办法复现,结果倒是对的。
4
1 2 3 4
2
3
4
1

CEBBCAT

18

CEBBCAT      2024 年 3 月 22 日   ❤️ 1

尝试使用输入重定向来解决,我怀疑你复制粘贴的字符掺杂了不可见字符之类的。

例如,echo '8\n\n1 2 3\n' > t; cat t | od -xa; cat t | ./a.exe

已经会用调试器了啊,很好,这些奇奇怪怪的问题可以追查,相信最后要不发现哭笑不得的错误,要不然就是对计算机有更多了解。或者也可以切换到其他平台比如 Linux macOS 。

另外,论坛里面有很多半吊子的,网上也是,有的时候别太信。小马过河,尽量规避因为别人的鼠目寸光给自己带来的误导

MoYi123

19

MoYi123      2024 年 3 月 22 日

如果要在 clion 的 terminal 里输入, 推荐把 Emulate terminal in the output console 打开

araraloren

20

araraloren      2024 年 3 月 22 日

@yolee599 `scanf` can handle the input correctly, you don't need enter line by line.

lff0305

21

lff0305      2024 年 3 月 22 日

在 Linux 下用 GCC 测试了下没有发现问题

这个问题是否和 Clion 的 Console 有关系?

nevermoreluo

23

nevermoreluo      2024 年 3 月 22 日

同 Clion2023.3.4 ,mingw11 没复现
建议自己断点 debug 找找吧,这里总共也没多少数

WilliamColton

24

WilliamColton      2024 年 3 月 22 日

@nevermoreluo #23 但是我在同学电脑的 CLion 上都可成功复现,应该是我和你方法不一样?
然后我已经设断点找过了,代码一运行到那里就 num 就变成 0 ,进去 scanf 也没看出啥有用的信息来,再进一层就是汇编了,这个是真看不懂(能力有限,大一新生,望谅解)
我等会再找一个同学安装 CLion 试试
同时下面两张图是我的方法

cnbatch

25

cnbatch      2024 年 3 月 22 日   ❤️ 1

第九行那个 scanf ,双引号内有个空格,但你原贴给出的代码,这一行的双引号内没空格

cnbatch

28

cnbatch      2024 年 3 月 23 日   ❤️ 1

我自己用 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 反倒最稳妥

nevermoreluo

30

nevermoreluo      2024 年 3 月 23 日

单纯有点好奇你的 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
```