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

问题描述:

我的代码需要一个字符串,并显示偶数索引位置字母,然后在一个空格后显示奇怪的索引字母。 就像我给一个输入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; 
} 
+4

使用'i!= a.size()'作为条件,'a [i]!='\ 0''有点可笑 –

+1

[cin和getline跳过输入](http:/ /stackoverflow.com/questions/10553597/cin-and-getline-skipping-input),检查哪些忽略参数使用。 – stefaanv

你应该移动std::cin.ignore()外循环。 getline消耗换行符,只是第一个输入离开它(cin>>t)。

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

+0

感谢您的解决方案,但我不明白为什么它早先给我错误。 –

+0

我试图进一步澄清它,希望它有帮助 – yassin

+1

因为在输入的第一个单词之后,ignore()(在循环中)导致下一个字符,Rank的'R'被忽略。 – Rene

cin.ignore()的默认值是仅忽略单个字符。就像你的新生产线一样。这是从循环的第二次迭代开始发生的。此外,如果你想忽略更长的字符串,你必须添加额外的参数,可能是cin.ignore(1000,'\ n'),它跳过多达1000个字符或下一个换行符(以二者为准)第一)。

希望这会有所帮助。

+0

我试过,..still的情况是一样的。但是在它的循环之外移动std :: cin.ignore()。 –

+0

它没有解决任何问题,只是通过强制刷新输出流来增加不需要的开销。 – StoryTeller

+1

好的,我要编辑我的答案。谢谢@Story Teller –