Почему этот код не работает, когда я использую cin.getline вместо cin? - PullRequest
0 голосов
/ 10 апреля 2020

Моя цель - решить эту проблему:

Если задана строка S длиной N, которая проиндексирована от 0 до N-1, выведите ее четные и нечетные символы как 2 пробела. строк в одной строке

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

int main() {

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

        char str[10000];
        cin.ignore();
        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;
}

Приведенный выше код дает мне вывод в виде:

Hce akr 
ak n 

для заданного ввода:

2 
Hacker
Rank

Но когда я использую cin>>str вместо cin.ignore() и cin.getline(), я получаю правильный ожидаемый результат:

Hce akr 
Rn ak

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

Вы должны написать cin.ignore (); до для l oop. Ваш код игнорирует первый символ каждой строки без первой итерации. Вам нужно игнорировать разрыв строки только для проверки не для каждой строки.

см. Следующий код:

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;
}

input:
5
Хакер
Ранг
WoW
проверка
последний

вывод:
Hce akr
Rn ak
WW o
cek h c
То же самое

0 голосов
/ 10 апреля 2020

Использование ignore() + getline():

На первой итерации l oop, cin.ignore() пропускает разрыв строки, оставшийся после cin>>test, затем cin.getline() читает всю строку (Hacker) , включая, но проглатывая разрыв строки .

На второй итерации l oop, cin.ignore() пропускает 1-й символ следующего (R), а затем cin.getline() читает оставшиеся символы в той же строке (ank), включая, но глотая разрыв строки.

Решение состоит в том, чтобы переместить вызов на cin.ignore() для выше l oop:

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>>:

На первой итерации l oop, cin>>str пропускает разрыв строки, который был оставлен после cin>>test и затем считывает следующее доступное слово (Hacker).

На второй итерации l oop, cin>>str пропускает разрыв строки, оставшийся после предыдущего cin>>str и затем читает следующее доступное слово (Rank).

...