C语言复用字符数组时末尾出现上一次输入残留字符问题排查
问题根因分析
你出现残留字符的核心原因是加了多余的++i操作,导致空字符\0的赋值位置错误,没有正确覆盖前一次输入的残留内容。
空字符\0的作用
C语言中没有原生的字符串类型,所有字符串本质上都是以\0(ASCII值为0的字符)作为结束标记的字符数组。printf执行%s格式化输出时,会从传入的字符数组首地址开始逐个读取字符打印,直到遇到\0才会终止输出。
错误逻辑拆解
我们以你给出的复现场景为例走一遍执行流程:
- 第一次输入
aa加回车:- 循环执行2次:
line[0]='a'后i自增为1;line[1]='a'后i自增为2 - 第三次读取到换行符
\n,循环终止,此时i=2 - 你执行了多余的
++i,i变为3,仅将line[3] = '\0'
- 循环执行2次:
- 第二次输入
b加回车:- 循环执行1次:
line[0]='b'后i自增为1 - 第二次读取到换行符
\n,循环终止,此时i=1 - 你又执行多余的
++i,i变为2,将line[2] = '\0' - 此时数组前3位为
['b','a','\0'],line[1]还是第一次输入残留的a,printf读取到\0才停止,因此输出ba
- 循环执行1次:
修复方案
删掉两次循环后的++i操作,直接在循环结束后的i位置赋值\0即可。循环退出时i刚好就是最后一个存入字符的下一位,也就是放置\0的正确位置。
修正后的代码如下:
#include <stdio.h> #define MAX 1000 int main() { char line[MAX]; int i; int c; for (i = 0; (c = getchar()) != EOF && c != '\n' && i < MAX - 1; ++i) { line[i] = c; } line[i] = '\0'; printf("%s\n", line); for (i = 0; (c = getchar()) != EOF && c != '\n' && i < MAX - 1; ++i) { line[i] = c; } line[i] = '\0'; printf("%s\n", line); return 0; }
内容的提问来源于stack exchange,提问作者user3056783
相关产品推荐
相关产品推荐

