为什么我的字符串第二次没有正确输入?

时间:2016-11-08 13:10:34

标签: c++ string

我的代码采用字符串并显示偶数索引位置字母,然后在显示奇数索引字母的空格后显示。 就像我提供输入Hacker一样,它应该给Hce akr。 现在我的代码没有给我第二个输入的正确答案。 就像给出Rank的第二个输入一样,它应该给Rn ak。 而不是它提供了k。这里它错过了R

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;

void f(string a) {

    string odd,even;
    for(int i=0; a[i] != '\0'; i++) {
        if(i % 2 == 0) {
            even = even + a[i];
        } else {
            odd = odd + a[i];
        }
    }

    cout << even << " " << odd << "\n";//<<<<<<I THINK THIS \n IS THE 

      //PROBLEM BUT I NEED THIS \n.I OBESERVED THAT ON REMOVING \n, CODES
      // WORKS CORRECTLY.
}

int main() {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT */
    string str;
    int t;
    cin >> t;

    for(int i=0; i < t; i++) {
        std::cin.ignore();
        getline(cin, str);
        f(str);
    }

    return 0;
}

2 个答案:

答案 0 :(得分:3)

您应该将std::cin.ignore()移到循环之外。 getline使用换行符,只是第一个输入离开它(cin>>t)。

当您阅读例如一个int或一个char,输入后的换行符保留在输入流中。因此,现在执行getline只会读取换行符,并调用cin.ignore()来使用换行符。但是每个getline()消耗整行,包括换行符,所以你不必调用cin.ignore(),如果你这样做,它默认会消耗一个字符,这里是'R'。 / p>

答案 1 :(得分:0)

cin.ignore()的默认设置是忽略一个字符。就像你的新系列一样。这是从循环的第二次迭代开始发生的。

此外,如果你想忽略更长的字符串,你必须为其添加额外的参数,可能是 cin.ignore(1000,'\ n'),最多跳过1000个字符或下一个字符换行(以先到者为准)。

希望这有帮助。