为什么我最后一个cout的第一个字母会被切断?

时间:2016-02-17 17:12:01

标签: c++

int main () {
    const int MAX_INPUT = 99;
    string names[MAX_INPUT];
    string eraseName;
    string newList;
    int numNames = 0;
    int i = 0;


    cout << "How many names do you want (max 99)? ";
    cin >> numNames;   

    do {
        if(numNames > MAX_INPUT) {
            cout << "Out of memory!" << endl;
            break;
        }  
        cout << "Enter name #" << (i+1) << ": ";
        cin.ignore();
        getline(cin,names[i]);
        ++i;
    }  
    while (i < numNames);

    cout << "What name do you want to eliminate? ";
    getline(cin,eraseName);
    cout << "Here is the list in reverse order, skipping ";
    cout << eraseName << "..." << endl;

    i = 0;
    for (i = 0; i < numNames; ++i) {
        cout << names[i] << endl;
    }       
    return 0;
} 

我有一个任务,我必须“消除”数组中的元素并重新创建输出。我知道我的最终for循环不会删除元素,它就在那里,因为我正在测试这个问题,但如果名字有两个输入(John Doe和Jane Doe),我说要告诉他们最后的循环couts:

John Doe
美国能源公司

2 个答案:

答案 0 :(得分:3)

cin.ignore()之后,在读取名称的循环之前移动cin >> numNames;

您只需要忽略在读取名称数量后留在流中的换行符。 getline()从流中读取(并忽略)换行符,因此在读取每个名称之前无需再次调用ignore()。结果,它正在阅读并忽略名称的第一个字符。

答案 1 :(得分:1)

以下代码块

if(numNames > MAX_INPUT) {
   cout << "Out of memory!" << endl;
   break;
 }  

不需要在do-while循环的每次迭代中执行。您可以更改要使用的功能:

if(numNames > MAX_INPUT) {
   cout << "Out of memory!" << endl;
   // Deal with the problem. Exit??
}

do {
    cout << "Enter name #" << (i+1) << ": ";
    cin.ignore();
    getline(cin,names[i]);
    ++i;
}  while (i < numNames);

一旦你将支票移出循环,你必须问自己,“我是否需要在循环的每次迭代中忽略一个字符?”答案是不”。只有在阅读numNames后才需要忽略换行符。所以,你也将它移出循环。

if(numNames > MAX_INPUT) {
   cout << "Out of memory!" << endl;
   // Deal with the problem. Exit??
}

// Ignore the newline left on the stream before reading names.
cin.ignore();

do {
    cout << "Enter name #" << (i+1) << ": ";
    getline(cin,names[i]);
    ++i;
}  while (i < numNames);

您可以通过使用以下内容确保忽略换行符中的所有内容来改进:

cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

添加

#include <limits>

能够使用std::numeric_limits