这段代码中应该如何使用 cin.ignore() 函数?

How should the cin.ignore() function be used in this code?

我的目标是解决这个问题:

Given a string S, of length N that is indexed from 0 to N-1, print its even-indexed and odd-indexed characters as 2 space-separated strings on a single line

int main() {

    int test;
    cin>>test;
    for(int j = 0; j < test; j++){

        char str[10000];
        cin.ignore();
        cin.getline(str,9999);
        for( int i = 0; i < strlen(str); i++)
        {
            if(i % 2 == 0)
                cout<<str[i];
        }
        cout <<" ";
        for(int i = 0; i < strlen(str); i++)
        {
            if((i % 2 != 0))
                cout<<str[i];
        }

        cout << endl;
    }

    return 0;
}

以上代码给出的输出为:

Hce阿克尔
kn

对于给定的输入:

2个
黑客
秩

但是当我使用 cin>>str 而不是 cin.ignore()cin.getline() 时,我得到了正确的预期输出:这如何改变结果?

Hce阿克尔
Rnak

使用ignore()+getline():

在第一次循环迭代中,cin.ignore() 跳过 cin>>test 留下的换行符,然后 cin.getline() 读取整行 (Hacker) 包括但吞下换行符

在第二次循环迭代中,cin.ignore() 跳过下一行的第一个字符 (R),然后 cin.getline() 读取同一行的剩余字符 (ank) 包括但吞下换行符。

解决方案是将对 cin.ignore() 的调用移动到循环之上:

cin>>test;
cin.ignore(numeric_limits<streamsize>::max(), '\n'); // <-- move here

for(int j = 0; j < test; j++){
    char str[10000];
    cin.getline(str,9999);
    ...
}

使用operator>>:

在第一次循环迭代中,cin>>str 跳过 cin>>test 留下的换行符,然后读取下一个可用单词 (Hacker)。

在第二次循环迭代中,cin>>str 跳过前一个 cin>>str 留下的换行符,然后读取下一个可用单词 (Rank)。

你应该在 for loop 之前写 cin.ignore(); 。您的代码在没有第一次迭代的情况下忽略每个字符串的第一个字符。您需要忽略换行符,而不是对每个字符串进行测试。

查看下面的代码:

int main() {

    int test;
    cin>>test;
    cin.ignore();
    for(int j = 0; j < test; j++){

        char str[10000];
        cin.getline(str,9999);
        //cin>>str;

        for( int i = 0; i < strlen(str); i++)
        {
            if(i % 2 == 0)
                cout<<str[i];
        }
        cout <<" ";
        for(int i = 0; i < strlen(str); i++)
        {
            if((i % 2 != 0))
                cout<<str[i];
        }

        cout << endl;
    }

    return 0;
}

输入:
5
黑客
排名

检查
最后一个

输出:
Hce akr
rn ak
WO
cek hc
lsoe atn