2016-11-08 2 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 passipping input] (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() (в цикле) вызвало следующий символ, «R» из Ранга, чтобы его игнорировать. – Rene

0

По умолчанию для cin.ignore() - игнорировать только один символ. Также как ваша новая линия. который начинался с второй итерации цикла.

Кроме того, если вы хотите игнорировать более длинные строки, вы должны добавить дополнительные параметры, которые, возможно, cin.ignore (1000, «\ п»), который пропускает до 1000 символов или следующей строки (в зависимости от того приходит первый).

Надеюсь, это поможет.

+0

Я пробовал, что ..если ситуация была такой же. Но при перемещении std :: cin.ignore() за пределы цикла он работал. –

+0

Он ничего не решает и просто добавляет ненужные накладные расходы, принудительно промывая выходной поток. – StoryTeller

+1

Хорошо, я собираюсь Редактировать свой ответ. Спасибо @Story Teller –