2016-11-08 114 views
0

我的代碼需要一個字符串,並顯示偶數索引位置字母,然後在一個空格後顯示奇怪的索引字母。 就像我給一個輸入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

回答

3

你應該移動std::cin.ignore()外循環。 getline消耗換行符,只是第一個輸入離開它(cin>>t)。

當你閱讀例如int或char,輸入後的換行符保留在輸入流中。因此,現在做一個getline只會讀取換行符,並且您調用cin.ignore()來使用換行符。但是,每個getline()消耗整行(包括換行符),因此您不必調用cin.ignore(),如果這樣做,它將默認消耗一個字符,這裏是'R'。

+0

感謝您的解決方案,但我不明白爲什麼它早先給我錯誤。 –

+0

我試圖進一步澄清它,希望它有幫助 – yassin

+1

因爲在輸入的第一個單詞之後,ignore()(在循環中)導致下一個字符,Rank的'R'被忽略。 – Rene

0

cin.ignore()的默認值是僅忽略單個字符。就像你的新生產線一樣。這是從循環的第二次迭代開始發生的。此外,如果你想忽略更長的字符串,你必須添加額外的參數,可能是cin.ignore(1000,'\ n'),它跳過多達1000個字符或下一個換行符(以二者爲準)第一)。

希望這會有所幫助。

+0

我試過,..still的情況是一樣的。但是在它的循環之外移動std :: cin.ignore()。 –

+0

它沒有解決任何問題,只是通過強制刷新輸出流來增加不需要的開銷。 – StoryTeller

+1

好的,我要編輯我的答案。謝謝@Story Teller –