我的代码是
char buffer[10]={0};
cin>>buffer; //here i enter the contents as "12345678912345"
//Now i tried to enter 14 characters into a buffer of 10
cin>>buffer; //This works as it waits for input on the console
cout<<buffer;
wheras
char buffer[10]={0};
cin>>buffer;//same input as above "12345678912345"
cin.getline(buffer,10);//This doesn't wait for input on console and returns
cout<<buffer;
为什么会这样?
感谢: 感谢大家的回答,他们很有帮助
答案 0 :(得分:4)
两个代码片段都没有“工作”,因为它们都会溢出第一个输入行中的缓冲区。这根本不是一件好事。
由于operator>>
和getline
之间的技术差异,第二种情况不等待输入 - 它们对您输入的换行符的反应不同。读取第一个cin >> buffer
时,输入末尾的换行符将保留在输入流(cin
)中。在第一种情况下,第二个cin >> buffer
将跳过输入缓冲区中的换行符,然后等待更多输入。
在第二种情况下,由于getline
的工作原理,它接受剩余的换行符作为输入,并且缓冲区没有填充任何内容。
将getline
和operator>>
混合输入时,这是一个常见问题。解决该特定问题的最佳解决方案是仅使用operator >>
或仅使用getline
- 还有其他各种解决方案,但它们通常非常难以正确使用。
答案 1 :(得分:3)
首先你有一个缓冲区溢出:当流变坏,找到空格时读取char*
个停止点,或者如果它大于0则读取width()
。你想要使用
std::cin >> std::setw(10) >> buffer;
假设这种未定义的行为是明显的,那么对于第二次读取使用格式化和未格式化输入之间的区别在于格式化输入以跳过前导空格开始,而未格式化输入则没有。您的第一个输入在输入键产生的换行符之前停止。该换行符对getline()
足够好,但在使用>>
时会跳过它。
在格式化和未格式化的I / O之间切换时,您通常希望使用例如std::ws
操纵器跳过前导空格:
(std::cin >> std::ws). getline(buffer, 10);
您还应考虑将std::string
与std::getline()
一起使用。
答案 2 :(得分:2)
在控制台中输入缓冲区的值时,返回仍然存储在输入流中。
因此,'\n'
已经从先前的读操作中读取了终止字符getline()
。这就是为什么这个函数不再等待用户输入的原因。
尝试在getline()
操作之前阅读cin >>
。
另外,正如Mike所说,你应该注意不要导致缓冲区溢出。
答案 3 :(得分:2)
>>
运算符不消耗任何空格,包括换行符。 getline
函数在看到换行符时返回。您的问题是>>
语句在缓冲区中留下的换行符。您可以通过使用所有字符(包括换行符)来解决此问题,直到您在缓冲区中看到换行符。请参阅ignore function:
char buffer[10]={0};
cin>>buffer;
cin.ignore('\n', 256);
cin.getline(buffer,9);
cout<<buffer;
return 0;