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

为何cin读取行后,第0个字符p在带空格输出时未正常显示?

带空格输出字符时首字符丢失的原因分析

问题描述

我从文本文件中读取一行内容,使用for循环逐个打印该行字符。为何在带空格输出字符的循环中,行的第0个字符p未被打印?

代码示例

#include<iostream>
#include<cstring>
using namespace std;

int main()
{
    const int max_length = 100; 
    char line1[max_length];
    
    freopen("input2.txt", "r", stdin);
    cin.getline(line1, max_length);
    
    for (int i = 0; line1[i] != '\0'; i++)
       cout<<line1[i]<<" "; 

    cout << "\n";
    for (int i = 0; line1[i] != '\0'; i++)
       cout<<line1[i];       

    cout << "\n";
    fclose(stdin);
    
    return 0;
}

文件输入内容

pqrstuwvx

输出结果

q r s t u w v x 
 pqrstuwvx

直接使用cout<<line1[i];输出时结果看似正确,但带空格输出时首字符p消失,原因如下:

原因分析

你的输入文件input2.txt的第一行开头实际存在一个不可见的空白字符(比如空格或制表符),并非你看到的pqrstuwvx直接开头:

  • cin.getline会把这个开头的空白字符读入line1[0],你以为的p其实是line1[1];
  • 第一个循环中,line1[0]是空白字符,输出时显示为一个空格,再加上代码中额外输出的空格,就变成了两个空格开头,后续才是q及其他字符,看起来像是p丢失;
  • 第二个循环直接输出所有字符,开头的空白字符加上pqrstuwvx,就显示为 pqrstuwvx(前面有一个空格),这和第一个循环开头的两个空格完全对应。

验证与解决

验证方法

可以在读取行后打印每个字符的ASCII码来确认:

for (int i = 0; line1[i] != '\0'; i++)
    cout << i << ": " << (int)line1[i] << " (" << line1[i] << ")\n";

执行后会看到line1[0]的ASCII码为32(空格),line1[1]才是p(ASCII码112)。

解决方案

  • 直接检查并修改input2.txt,确保行开头没有多余的空白字符;
  • 或者在读取后跳过开头的空白字符再输出:
int i = 0;
// 跳过所有开头的空白字符
while (line1[i] != '\0' && isspace(line1[i])) i++;
// 开始输出
for (; line1[i] != '\0'; i++)
    cout << line1[i] << " ";

内容的提问来源于stack exchange,提问作者Deba

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 21:55:02