C语言中使用scanf循环动态读取字符的问题排查
你的C语言字符读取问题分析与修复
先直接点出你代码里的几个核心问题:
未初始化的
tempOld变量
你定义了tempOld但没给它初始值,第一次循环判断tempOld != '\n'的时候,这个变量的值是内存里的随机垃圾值——这就像你拿一个不知道是什么的东西去和换行符比,程序完全不知道该怎么执行,行为全是不可预测的。循环逻辑完全搞反了
你想要的是“读到换行就停止”,但你的循环条件却是检查上一个字符不是换行,这完全拧过来了。而且这个逻辑会导致:当你输入字符+回车后,第一次读入字符,第二次读入换行符时,因为上一个字符(也就是你输入的那个字符)不是换行,循环会继续执行,把换行符也存进数组,然后下一次循环要等你再输入一次回车,这时候tempOld已经是换行符了,循环才会退出——这就是为啥你要按两次回车的原因。没有数组溢出保护
你的string数组只有80个位置,但循环没限制i的大小,万一输入超过79个字符,就会越界写内存,搞不好直接崩了。
给你改好的代码,直接能用:
int i = 0; char string[80]; char temp; // 循环读取:数组没满、读取成功、当前字符不是换行就继续 while (i < 79 && scanf("%c", &temp) == 1 && temp != '\n') { string[i] = temp; i++; } string[i] = '\0'; // 别忘了加字符串结束符,不然后续操作字符串会出问题
改完后的逻辑说明:
- 去掉了没用的
tempOld,直接判断当前读入的temp是不是换行符,读到回车就立刻停止循环,不用再按第二次。 - 加了
i <79的判断,保证数组不会越界(因为最后一个位置要留着放'\0',字符串必须以这个结尾)。 - 现在你输入任意长度(最多79个)的字符,按一次回车就会停止,所有输入的字符都会正确存在
string里。
内容的提问来源于stack exchange,提问作者Aurelien Montmejat
相关产品推荐
相关产品推荐

