当我编写此代码时,我无法输入两行作为输入,其中每行包含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);
}
那么,这背后的逻辑是什么?
答案 0 :(得分:2)
gets
。见Why gets() is deprecated?。请勿混用cin
和stdio.h
中的函数。默认情况下,cin
与stdin
同步。但是,可以使用
std::ios_base::sync_with_stdio(false);
有关详细信息,请参阅http://en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio。
真正的问题。
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;
}