【问题标题】:Program is printing unexpected blank lines [duplicate]程序正在打印意外的空白行[重复]
【发布时间】:2016-03-18 21:22:49
【问题描述】:

考虑这段代码:

#include <iostream>
#include <string>
using namespace std;
int main(){
   int n = 1;
   string data[13];
   while(n > 0){
      cin >> n;
      for(int i = 0; i < n; i++){
         getline(cin,data[i]);
         cout << data[i] << endl;
      }
   }
}

我在我的 android 上的 cppdroid 中编译了这个。我想在数组中保留 n 行。 (n

2

This is line 1.
This is line 1.
And this is line 2.
And this is line 2.

我想删除不需要的空格。

【问题讨论】:

    标签: c++


    【解决方案1】:

    cin >> n;
    

    仅使用您输入的数字,并在输入缓冲区中留下 换行符(至少)。

    这个换行符然后被第一个执行的读取并输出

    getline(cin,data[i]);
    cout << data[i] << endl;
    

    为避免这种情况,您也可以将字符串的getline 用于整数输入,例如通过stoi 转换为整数。或者,不太健壮,您可以在流上调用 ignore 方法来忽略直到并包括下一个换行符的所有内容。它的鲁棒性较差,因为格式化的整数输入会使流处于错误模式,在该模式下它会忽略进一步的输入操作,直到错误模式被清除。

    重新数组,最好使用std::vector。那么你不需要决定一个固定的容量。

    【讨论】:

    • 试过了.cppdroid 给出了编译器错误。 stoi 未声明。可能需要更新版本吗? ://
    • @RedwanulSourav: std::stoi 是在 C++11 中引入的(我们现在是 C++14),位于 &lt;string&gt; 标头中。对于 g++,您需要使用 -std=c++11-std=c++14
    【解决方案2】:

    cin &gt;&gt; n 读取数字但在输入流中保留换行符。您对getline 的第一次调用会读取到该内容,因此您从空行开始。

    【讨论】:

      【解决方案3】:

      问题是您正在使用运算符 >> 混合调用 getline()。 请记住,运算符 >> 忽略了前导空格,因此将正确地跨行边界继续。但是在成功检索输入后停止读取,因此不会吞下尾随的 '\n' 字符。因此,如果您在 >> 之后使用 getline(),除非您小心(首先删除未读取的 '\n' 字符),否则通常会得到错误的结果。

      诀窍是不要同时使用这两种输入。 如果您在 cin >> yourdata 之后使用 getline,则需要将换行符从缓冲区中刷新。

          #include <iostream>
          #include <string>
          using namespace std;
          int main(){
              int n = 1;
              string data[13];
              while(n > 0){
                  cin >> n;
                  cin.ignore(10,'\n'); // insert this into your code
                  for(int i = 0; i < n; i++){
                      getline(cin,data[i]);
                      cout << data[i] << endl;
                  }
             }
             return 0;
          }
      

      【讨论】:

      • 忽略(10,'\n'); '\n' 是否为 10 ASCII 值?
      • 不,基本上忽略如下工作:从输入序列中提取字符并丢弃它们,直到提取了 n 个字符(在本例中为 10 个),或者一个比较等于 delim('\n ')。您可以根据需要使用任何值。
      • 如果我的字符串正好有 25 个字符,那么这应该是 ignore(25,'\n');我说的对吗?
      • 是的,没错。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多