如何在c ++中逐字符输入?

时间:2013-09-12 15:30:40

标签: c++ c io getchar

首先,我需要阅读两个整数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);
    }
}

2 个答案:

答案 0 :(得分:3)

你可以通过阅读一个角色来做到这一点。

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

&gt;&gt;操作员将避免任何形式的分隔,空格,新线等。

答案 1 :(得分:2)

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

来自10来电的剩余\n字符的第一个cin << N << Q;

其他49代表ASCII 150代表ASCII 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');