Как мне получить символ за символом ввода в С++?

Сначала мне нужно прочитать два целых числа N и Q, разделенных пробелом. Я делаю это с помощью cin. Затем в следующих двух строках следуют два двоичных числа, каждое из N цифр. Я пытаюсь прочитать эти числа по крупицам, используя getchar() и помещая их в вектор int, но он печатает значения мусора. Есть ли проблема с символом новой строки. Я знаю, что мог бы сначала прочитать их в строку, а затем поместить в вектор, но я хотел сделать так. Вот мой код:

#include <iostream>
#include <algorithm>
#include <vector>
#include <stdio.h>
using namespace std;
int main(){
    int N;
    int Q;
    cin >>N>>Q;
    string A, B;
    //cin >> A>>B;
    vector <int> Abit;
    vector <int> Bbit;

    for (int i=0;i<N;i++){
        char c= (int) getchar();
        Abit.push_back(c);
    }
    for (int i=0;i<N;i++){
    //  cout << Abit.at(i);
        char c= (int) getchar();
        Bbit.push_back(c);
    }
    for (int i=0;i<N;i++){
        cout << Abit.at(i);
    //  char c= (int) getchar();
    //  Bbit.push_back(c);
    }
}

person rishiag    schedule 12.09.2013    source источник
comment
Похоже, вы читаете две строки, когда делаете cin >> A >> B? Может, попробовать избавиться от этого?   -  person Xymostech    schedule 12.09.2013
comment
@Xymostech да, извините за это. Я обновил вопрос. Он печатает мусорные значения.   -  person rishiag    schedule 12.09.2013
comment
Возможно, вы получаете значения символов 0 и 1. Вы пытались сделать что-то вроде getchar() - '0'?   -  person Xymostech    schedule 12.09.2013
comment
@Xymostech Спасибо, это решило половину моей проблемы. Теперь единственное, что мой вектор сначала для цикла, это чтение символа новой строки, который я нажимаю после получения N и Q. Итак, первый бит моего вектора испорчен, но остальные в порядке. Любые идеи, как я могу это решить?   -  person rishiag    schedule 12.09.2013
comment
Две битовые строки, разделенные пробелом. т.е. 10110100 10110111 ? Я должен предположить, что это становится тривиальным, если они есть.   -  person WhozCraig    schedule 12.09.2013
comment
@Xymostech Решил это. Просто добавил две строки getline, где я нажимаю ввод.   -  person rishiag    schedule 12.09.2013


Ответы (2)


Вы можете просто сделать это, прочитав символ.

char c;
for ( int i = 0; i < N; ++i ){
  cin >> c;
  Abit.push_back(c);
}
for ( int i = 0; i < N; ++i ){
  cin >> c;
  Bbit.push_back(c);
}

оператор >> будет избегать любой формы разделения, пробела, новой строки и т. д.

person BigTailWolf    schedule 12.09.2013
comment
Пропуском пробелов можно управлять с помощью ios::skip_ws. - person greyfade; 13.09.2013

Каждый раз, когда вы вводите символ и нажимаете клавишу возврата, getchar будет вызываться дважды — первый раз для введенного вами символа и второй раз для символа '\n'. Итак, если вы введете 1 2 3 4 5, вы вернете в свой вектор следующее: 10, 49, 10, 50, 10.

Первый 10 if для оставшихся \n символов от cin << N << Q; вызова.

Другой 49 означает ASCII 1, а 50 — ASCII 2.

Вы можете прочитать всю строку в строку, а затем извлечь символы из строки. Конечно, вам все еще нужно преобразовать символы ASCII в целые числа, но вы можете сделать это, вычитая значение символа из значения ASCII 0: c - '0'.

Кроме того, вы можете удалить игнорирование всех до и включая новую строку, прочитав их перед фактической цифрой:

 while(getchar() != '\n');
 char c= (int) getchar() - '0';

Charlie Burns предлагает лучший способ, который пропустит все новые строки перед цифрой. Вам просто нужно прочитать все символы новой строки перед фактической цифрой:

    char c;
    while((c = getchar()) == '\n');
    Abit.push_back(c - '0');
person Nemanja Boric    schedule 12.09.2013
comment
Этот фрагмент кода, while(getchar() != '\n'); не похоже, что он будет пропускать новые строки. Я что-то пропустил? - person Charlie Burns; 12.09.2013
comment
Возможно, вам нужно что-то вроде while((c = getchar()) == '\n'); ? Тогда c содержит первый символ, который не является новой строкой? - person Charlie Burns; 12.09.2013
comment
Он будет читать все символы до символа \n, включая символ \n, когда он сломается. - person Nemanja Boric; 12.09.2013
comment
@CharlieBurns да, это лучшее предложение. - person Nemanja Boric; 12.09.2013