C++ 在c+中使用向量的数组的第一个索引处缺少第一个字母+;

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

你好。我是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<<"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”。如何解决这个问题?我不知道第一个字母丢失的原因是什么。

查看for
cin.ignore()
。如果没有参数,它将忽略从文件读取的第一个字符,这就是为什么您的输出
ohn
缺少第一个字符,
J

查看for
cin.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啊,现在我明白了。我已经用其他想法更新了答案。