代码之家  ›  专栏  ›  技术社区  ›  Deba

为什么在cin语句中打印空格时,第0个字符没有打印出来?

  •  1
  • Deba  · 技术社区  · 2 年前

    我正在从文本文件中读取一行,并使用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 以这种方式声明 cout<<line1[i]; ,它给出了正确的输出。请给我解释一下原因。

    1 回复  |  直到 2 年前
        1
  •  2
  •   BlueSpider    2 年前

    @Deba在我看来,这个问题与使用有关 freopen 重定向标准输入( stdin )到文件。

    当你用 cin.getline ,它留下换行符( '\n' )在输入缓冲器中。因此,当您开始使用 for 循环中,遇到的第一个字符是换行符,这就是为什么您看不到 p 正在打印。

    为了解决此问题,我尝试向添加一个附加呼叫 cin.ignore 从文件中读取行之后。这是修改后的代码:

    #include<iostream>
    #include<cstring>
    using namespace std;
    
    int main()
    {
        const int max_length = 100; // Adjust this based on your text size
        char line1[max_length];
        
        freopen("index2.txt", "r", stdin);
        cin.getline(line1, max_length);
    
        // Add this line to consume the newline character
        cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        
        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;
    }
    

    希望对你的理解有所帮助。