2012-02-11 151 views
1

我正在用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

不,我是自学的。 Stanford Engineering Everywhere CS106B任务中的一小部分问题。 – 2012-02-11 19:10:38

+0

正如我所说的,小部分的自学作业问题-4 http://see.stanford.edu/materials/icspacs106b/H09-Assign1SimpleC.pdf – 2012-02-11 19:11:20

回答

2

我会给你一些提示,以便我不会为你解决问题,而是帮助你。

您不需要一次读取一个字符,您可以将每行读入一个string变量。此外,您需要使用std::getline(std::cin, stringvariable)而不是cin >> stringvariable,因为后者将跳过所有换行符,直到它变为非换行符为止,因此按自身键入将不会执行任何操作。

使用std::getline后,您可以通过比较字符串长度与0或调用empty来判断用户是否输入了任何内容。

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来获得整个字符串...

2

我不建议使用cin >>作为交互式程序。它的行为是明确定义的,但对于用户输入的输入而言通常是意想不到的。相反,使用类似:

std::getline(std::cin, surname); 

这会一直等待,直到用户键入了一堆东西,按下Enter键,不用像流为以后的缓冲数据奇异行为。

5

您不需要像这样初始化std::stringstring 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): "; 
} 

希望这有助于。