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
美国能源公司
答案 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
。