C++ 在c+中使用向量的数组的第一个索引处缺少第一个字母+;
你好。我是C++编程新手,我遇到了一个小问题…p> 这是我的密码C++ 在c+中使用向量的数组的第一个索引处缺少第一个字母+;,c++,C++,你好。我是C++编程新手,我遇到了一个小问题…p> 这是我的密码 #include<iostream> #include<string> #include<vector> using namespace std; int main() { string name; vector<string> name_array; bool add_more = true; cout<<endl<<"A
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main() {
string name;
vector<string> name_array;
bool add_more = true;
cout<<endl<<"Add name: ";
while(true) {
cin.ignore();
getline(cin, name);
name_array.push_back(name);
cout<<"Add more name? Yes(1) No(0): ";
cin>>add_more;
if(add_more == false)
break;
else {
cout<<endl<<"Add name: ";
}
}
cout<<"name list: "<<endl;
for(int i = 0; i < name_array.size(); i++) {
cout<<name_array[i]<<endl;
}
}
我们可以看到,用户输入了名称“John”,但结果是“ohn”。如何解决这个问题?我不知道第一个字母丢失的原因是什么。查看forcin.ignore()
。如果没有参数,它将忽略从文件读取的第一个字符,这就是为什么您的输出ohn
缺少第一个字符,J
查看forcin.ignore()
。如果没有参数,它将忽略从文件中读取的第一个字符,这就是为什么输出ohn
缺少第一个字符J
在上述两种代码中,输出未按要求打印。原因
这是一个已占用的缓冲区。“\n”字符仍保留在那里
在缓冲区中,作为下一个输入读取
然后
使用“cin>>ws”:在“cin”语句之后键入“cin>>ws”告诉
编译器忽略缓冲区并丢弃所有空白
在字符串或字符数组的实际内容之前
#包括
#包括
#包括
使用名称空间std;
int main(){
字符串名;
向量名_数组;
bool add_more=true;
库特
在上述两种代码中,输出未按要求打印。原因
这是一个已占用的缓冲区。“\n”字符保留在那里
在缓冲区中,作为下一个输入读取
然后
使用“cin>>ws”:在“cin”语句之后键入“cin>>ws”告诉
编译器忽略缓冲区并丢弃所有空白
在字符串或字符数组的实际内容之前
#包括
#包括
#包括
使用名称空间std;
int main(){
字符串名;
向量名_数组;
bool add_more=true;
这道题没有问题
cin.ignore();
您只需将一段代码更改为:
int ignore = 0;
while(true) {
cin.ignore(ignore++ ? 1 : 0);
getline(cin, name);
所以你只能用一次
但是这不是最好的想法。考虑另一种方法来摆脱IGENORE(),并使用<代码> CIN > 。
< P>线中的问题。
cin.ignore();
您只需将一段代码更改为:
int ignore = 0;
while(true) {
cin.ignore(ignore++ ? 1 : 0);
getline(cin, name);
所以你只能用一次
但是这不是最好的想法。考虑另一种方法来摆脱IGENORE(),而使用<代码> CIN > 。
< P>我最初建议使用<代码> CIN > >名称;< /COD>而不是<代码> GETLIN(CIN,name);< /Cord>。但是它不适用于多个单词的名称。
您可以使用Anatoliy R的建议,但如果将cin移动到循环末尾,则不需要额外变量。忽略:
string name;
vector<string> name_array;
bool add_more;
while (true) {
cout << "Add name: ";
getline(cin, name);
name_array.push_back(name);
cout << "Add more name? Yes(1) No(0): ";
cin >> add_more;
if (!add_more)
break;
cin.ignore(); // skip EOL left after `cin>>add_more`
}
cout << "\nName list:" << endl;
for (auto n : name_array) {
cout << n << endl;
}
我最初建议使用cin>>name;
而不是getline(cin,name);
但它不适用于多词名称
您可以使用Anatoliy R的建议,但如果将cin移动到循环末尾,则不需要额外变量。忽略:
string name;
vector<string> name_array;
bool add_more;
while (true) {
cout << "Add name: ";
getline(cin, name);
name_array.push_back(name);
cout << "Add more name? Yes(1) No(0): ";
cin >> add_more;
if (!add_more)
break;
cin.ignore(); // skip EOL left after `cin>>add_more`
}
cout << "\nName list:" << endl;
for (auto n : name_array) {
cout << n << endl;
}
当我删除cin.ignore();
时,行cin.ignore();
中的问题将在下一个循环中跳过getline(cin,name);
将代码更改为cin.ignore(ignore++?1:0);
并在循环之前添加int ignore=0;
,但这不是一个好主意。最好去掉ignore()使用另一种方法谢谢。你能发布你的答案,这样我就可以接受它作为正确的答案吗?我可以:-)-刚刚添加。但在严肃的开发中避免这种情况,这是非常人为的。当我删除cin.ignore();
时,行cin.ignore()
中的问题;
将在下一个循环中跳过。您可以通过将代码更改为cin.ignore(ignore++?1:0);
并在循环之前添加int ignore=0;
来修复此问题,但这不是一个好主意。最好去掉ignore()使用另一种方法谢谢。你能发布你的答案,这样我就可以接受它作为正确的答案吗?我可以:-)-刚刚添加。但在严重的开发中避免这种情况,这是非常人为的。谢谢,我尝试过,但添加ws
似乎出于某种原因不起作用。它不允许我再次输入其他名称。谢谢,我尝试过,但添加了ws
由于某些原因似乎不起作用。它将不允许我再次输入另一个名称。如果我使用cin>>name;
而不是getline(cin,name);
这只在字符串上没有空格的情况下才有效。例如,如果我添加了一个名称'mak mak'
。@NorynBasaya啊,现在我明白了。我已经用其他想法更新了答案。如果我使用cin>>名称;
而不是getline(cin,name)
只有在字符串上没有空格的情况下,这才有效。例如,如果我添加一个名称'mak-mak'
。@NorynBasaya啊,现在我明白了。我已经用其他想法更新了答案。