2

首先我需要读取两个用空格分隔的整数 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);
    }
}
4

2 回答 2

4

你可以简单地通过阅读一个字符来做到这一点。

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

>> 运算符将避免任何形式的分隔符、空格、换行符等。

于 2013-09-12T21:01:20.770 回答
3

每次你输入一个字符并按回车键,getchar都会被调用两次——第一次是你输入的字符,第二次是'\n'字符。因此,如果您输入1 2 3 4 5,您将在向量中推回以下内容:10, 49, 10, 50, 10

第一个10if 用于呼叫中剩余的\n字符cin << N << Q;

另一个49代表 ASCII150ASCII 2

您可能希望将整行读入字符串,然后从字符串中提取字符。当然,您仍然需要将 ASCII 字符转换为整数,但您可以通过从 ASCII 0:的值中减去字符值来实现c - '0'

此外,您可以通过在实际数字之前阅读它们来删除所有之前的忽略并包括换行符:

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

更好的方法,它会在Charlie Burns建议之前跳过所有换行符。Tou 只需要在实际数字之前读取所有换行符:

    char c;
    while((c = getchar()) == '\n');
    Abit.push_back(c - '0');
于 2013-09-12T15:40:44.690 回答