You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中使用scanf循环动态读取字符的问题排查

你的C语言字符读取问题分析与修复

先直接点出你代码里的几个核心问题:

  1. 未初始化的tempOld变量
    你定义了tempOld但没给它初始值,第一次循环判断tempOld != '\n'的时候,这个变量的值是内存里的随机垃圾值——这就像你拿一个不知道是什么的东西去和换行符比,程序完全不知道该怎么执行,行为全是不可预测的。

  2. 循环逻辑完全搞反了
    你想要的是“读到换行就停止”,但你的循环条件却是检查上一个字符不是换行,这完全拧过来了。而且这个逻辑会导致:当你输入字符+回车后,第一次读入字符,第二次读入换行符时,因为上一个字符(也就是你输入的那个字符)不是换行,循环会继续执行,把换行符也存进数组,然后下一次循环要等你再输入一次回车,这时候tempOld已经是换行符了,循环才会退出——这就是为啥你要按两次回车的原因。

  3. 没有数组溢出保护
    你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:14:59