#include <iostream>
#include <cstring>
using namespace std;
const int BUFFER_SIZE = 80;
void getstr(char* &str);
int main()
{
char* str;
while(true)
{
getstr(str);
if (!strlen(str))
break;
}
delete [] str;
return 0;
}
void getstr(char* &str)
{
char temp[BUFFER_SIZE];
cout<<"Enter a string(empty line to quit): ";
cin.get(temp, BUFFER_SIZE);
while(cin.get()!='\n')
continue;
str = new char [strlen(temp)+1];
strcpy(str, temp);
}
我在上面有一个字符串读取循环,输入一个空行来终止循环不起作用(在输入一个空行之后,程序停止对任何输入的响应)。但是,当我将getstr中的循环替换为单个cin.get()时,一切都很好。怎么了?
发布于 2020-07-31 17:05:46
当读取空字符串时,istream::get()
设置failbit
。
这使得cin.get()
返回EOF
,这是因为您不能中断循环while(cin.get()!='\n')
。
您可以使用ios::clear()
清除failbit
。
cin.get(temp, BUFFER_SIZE);
cin.clear(); // add this
while(cin.get()!='\n')
continue;
发布于 2020-07-31 17:08:05
cin.get(char* s, size_t n)
从流中提取字符,并将它们作为c字符串存储在s中,直到提取到(n-1)个字符或遇到分隔字符:分隔字符为换行符('\n')或delim (如果指定了此参数)。如果找到分隔字符,则不会从输入序列中提取该分隔字符,而是将其保留为要从流中提取的下一个字符(请参见getline以获取确实会丢弃该分隔字符的替代字符)。如果n大于零,即使提取了空字符串,也会自动将空字符('\0')追加到写入的序列中。
这就是问题所在。cin.get()
需要读取至少1个字符。您可以通过按Ctrl+D和Enter来关闭标准输入,然后,您的程序就完成了。
顺便说一句,您正在使用new
N次,但只有1次删除。您需要删除之前的缓冲区
发布于 2020-07-31 17:04:00
如果你要使用C++,你应该以一种客观一致的方式使用cin/cout。例如:
string name;
cout << "What is your name: ";
getline (cin, name);
cout << "Your name is: " << name;
您正在做的是一种C/C++混合(字符串对象的leu中的字符数组,但使用std
名称空间)。
现在,我知道这不是你的问题,但是你现在所做的有点不正统,这使得回答你的问题有点困难,如果不把代码放到编辑器中并进行调试的话。
https://stackoverflow.com/questions/63196029
复制