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

C语言复用字符数组时末尾出现上一次输入残留字符问题排查

问题根因分析

你出现残留字符的核心原因是加了多余的++i操作,导致空字符\0的赋值位置错误,没有正确覆盖前一次输入的残留内容。

空字符\0的作用

C语言中没有原生的字符串类型,所有字符串本质上都是以\0(ASCII值为0的字符)作为结束标记的字符数组。printf执行%s格式化输出时,会从传入的字符数组首地址开始逐个读取字符打印,直到遇到\0才会终止输出。

错误逻辑拆解

我们以你给出的复现场景为例走一遍执行流程:

  1. 第一次输入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

修复方案

删掉两次循环后的++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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:15:03