0

这是我使用 c++ 和 do while 循环的完整程序,它第一次可以正常工作,但是当它循环时它不能正常工作。

该程序将名称存储到一个数组中并打印出来。数组大小为 50,所以我想在数组中存储 50 个名称。

任何帮助将不胜感激。谢谢。

#include <iostream>
#include <cmath>
#include <string>
using namespace std;

void start(int c);

string NameArray [50];
char response;

int main() {
  int count=1;  
  do {    
    count = count - 1;
    start(count);
    cout << "do you want to add another name? ";
    cin>> response;     
    count = count + 2;      
    cout<< endl;        
  } while (tolower(response)=='y');

  cout<< "program Ends" <<endl;        
  system ("pause");        
  return 0;     
}    

void start(int count) {         
  cout<< "Enter your First and Last name: ";        
  getline(cin, NameArray[count]);       
  cout<< NameArray[count] <<endl;       
  cout<< endl;          
}
4

4 回答 4

2

cin>> response检索输入的一个字符,并将换行符留在输入流上。这将导致您的start()函数在提示您输入您的姓名后立即返回,并getline()返回一个空行输入到NameArray.

您可以改为使用getline()来检索您的响应作为字符串,然后检查该行的第一char

    //...
    cout << "do you want to add another name? ";
    std::string line;
    std::getline(std::cin, line);
    response = line[0];
    //...
于 2013-07-24T01:27:35.010 回答
0

首先使用显式循环和中断而不是执行while,因为这样可以避免缓冲区溢出并整理代码。我还添加了 jxh 响应中的修复程序。像这样的东西。(未经测试)

#include <iostream>
#include <cmath>
#include <string>
using namespace std;

void start(int c);

string NameArray [50];
std::string response;

int main() {
  for(int count=0; count<50; ++count) {
    start(count);
    cout << "do you want to add another name? ";
    std::getline(cin,response);
    if (tolower(response[0])=='y') break;
  }

  cout<< "program Ends" <<endl;        
  system ("pause");        
  return 0;     
}    

void start(int count) {         
  cout<< "Enter your First and Last name: ";        
  std::getline(cin, NameArray[count]);       
  cout<< NameArray[count] <<endl;       
  cout<< endl;          
}

但实际上,固定长度数组是一个我完全可以避免的问题,而是使用向量。然后你可以完全摆脱计数。代码看起来更像这样:

#include <iostream>
#include <string>
#include <vector>

std::string ask_user_for_name();

std::vector<string> NameArray;

int main() {
  do {
    NameArray.push_back( ask_user_for_name() );
    std::string response;
    cout << "do you want to add another name? ";
    std::getline(cin,response);
    if (tolower(response[0])=='y') break;
  } while(true);

  cout<< "program Ends" <<endl;        
  system ("pause");        
  return 0;     
}    

std::string ask_user_for_name() {         
  cout<< "Enter your First and Last name: ";        
  std::string retval;
  getline(cin, retval);
  cout<<retval<<std::endl<<std::endl;
  return retval;       
}
于 2013-07-24T01:20:10.327 回答
0

其他人提到了风格问题,但直接的问题在这里:

  cout << "do you want to add another name? ";
  cin>> response;
  count = count + 2;      
  cout<< endl;        
} while (tolower(response)=='y');

在您的start()函数中,您正确地读取了完整的行getline(),但在这里您cin >> response;将在输入缓冲区中留下换行符和其他内容。而是试试这个:

std::string response;

//...

  cout << "do you want to add another name? ";
  getline(cin, response);  // Changed here
  count = count + 2;      
  cout<< endl;        
} while (tolower(response[0])=='y'); // And changed here
于 2013-07-24T01:28:38.953 回答
-2

伙计们把这件事弄得太复杂了。您对 cin 的第二次调用正在读取换行符并立即返回。这是最快的解决方法:在 getline 调用之前添加 cin.ignore() :

cin.ignore();
getline(cin, NameArray[count]);
于 2013-07-24T01:35:36.023 回答