为何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
相关产品推荐
相关产品推荐

