在c ++中通过gets()函数输入多行

时间:2017-03-15 18:08:11

标签: c++ c++11 char

当我编写此代码时,我无法输入两行作为输入,其中每行包含3到5个单词 gets()功能:

int main()
{
    int t;
    cin>>t;
    char nm1[50],nm2[50];
    while(t--)
    {
       gets(nm1);
       gets(nm2);

       puts(nm1);
       puts(nm2);

    }
}

但是当我在 while()函数之前添加 gets()函数时,我现在可以输入两行字符串:

int t;
cin>>t;
char nm1[50],nm2[50];
gets(nm1); //using gets() function here//
while(t--)
{
   gets(nm1);
   gets(nm2);

   puts(nm1);
   puts(nm2);
}

那么,这背后的逻辑是什么?

3 个答案:

答案 0 :(得分:2)

  1. 请勿使用gets。见Why gets() is deprecated?
  2. 请勿混用cinstdio.h中的函数。默认情况下,cinstdin同步。但是,可以使用

    使它们保持不同步
    std::ios_base::sync_with_stdio(false);
    

    有关详细信息,请参阅http://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio

  3. 真正的问题。

    cin >> t;
    

    在输入流中留下换行符。下一次调用gets会读取该内容。如果您不希望gets读取该内容,则必须添加代码以读取并丢弃该行的其余部分。

    这是我的建议:

    int main()
    {
       int t;
       cin >> t;
    
       // Ignore the rest of the line.
       cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    
       char nm1[50],nm2[50];
       while(t--)
       {
          cin.get(nm1, 50);
          cin.get(nm2, 50);
    
          puts(nm1);
          puts(nm2);
       }
    }
    

    确保dd

    #include <limits>
    

    能够使用std::numeric_limits

答案 1 :(得分:0)

cin>>t中输入了一个数字,然后按下输入\n,如果你读取另一个整数cin>>another_integer,那么行尾仍然在缓冲区中等待,{{1将忽略cin\n(空格),但不会。你真正输入的内容如下:

5 ' ' ----看到行尾? 我的字符串\n
我更大的字符串\n

获取()读取,直到找到\n\n

顺便说一句,在c ++ 11中不推荐使用gets(),你应该使用getline()或其他函数

答案 2 :(得分:0)

我强烈建议使用C ++构造执行更安全的I / O:

int main()
{
  unsigned int quantity;
  cin >> quantity;
  // Now input the words
  std::vector<std::string> database;
  while (cin >> word)
  {
    database.push_back(word);
  }
  return 0;
}