我正在用C ++编写一个程序,它应该从用户那里获取一个输入字符串,打印它并要求用户再次键入另一个字符串并再次打印,直到用户按下返回键而不键入任何字符串。在这种情况下,程序应退出。
我想出了以下内容,但它没有按预期工作。有什么想法吗?
int main(){
string surname;
int c;
while (true) {
surname = "";
cout << "Enter surname (RETURN to quit): ";
c = cin.get();
if (c == '\n') {
break;
}
cin >> surname;
cout << surname << endl;
}
return 0;
}
答案 0 :(得分:5)
您无需像这样初始化std::string
:string surname; surname = "";
没有必要。
您可以使用getline
函数,然后检查此字符串是否为empty
,如下所示:
string surname;
cout << "Enter surname (RETURN to quit): ";
while (getline(cin, surname))
{
if (surname.empty())
break;
cout << surname << endl << "Enter surname (RETURN to quit): ";
}
希望这有帮助。
答案 1 :(得分:2)
我会给你一些提示,这样我就不会为你解决问题,而是帮助你。
您不需要一次读取一个字符,您可以将每一行读入string
变量。此外,您需要使用std::getline(std::cin, stringvariable)
而不是cin >> stringvariable
,因为后者将跳过所有换行符,直到它到达非换行符,因此按Enter键本身不会执行任何操作。
使用std::getline
后,您可以通过比较字符串的长度为0或在其上调用empty
来判断用户是否输入了任何内容。
答案 2 :(得分:2)
问题在于,当要求输入字符串时,iostream库将始终返回单个单词,忽略任何空格。这在大多数情况下非常有用。但是如果你想检测一个空字符串,你应该读一个字符,并检查它是否是一个新行字符:
while(true) {
char c;
string surname;
cout << "Enter surname (RETURN to quit): ";
cin.get(c)
if(c == '\n') break;
cin >> surname;
if(c != ' ' and c != '\t' and c != '\n')
surname.insert(0, c);
}
return 0;
请注意,如果名称长度为一个字符,则此解决方案存在一些问题。您可能需要使用cin.get
来获取整个字符串...
答案 3 :(得分:2)
我不建议将cin >>
用于交互式程序。它的行为定义明确,但对于用户输入的输入通常是意外的。相反,使用类似的东西:
std::getline(std::cin, surname);
这将一直等到用户键入一堆东西并按Enter键,而不会出现奇怪的行为,比如在流中缓冲数据以供日后使用。