c++ getline()函数在没有空格的输入中出错



这是一个我最近一直面临困难的代码-

int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n,k;
cin >> n >> k;
cin.ignore();
int arr[n];
fill_n(arr , n, 0);
int brr[n];
fill_n(brr , n, 1);
for(int i=1;i<=k;i++){ //Loop 1
    char str[8];
    cin.getline(str,9);
    if(str=="CLOSEALL") //block 1
        memset(arr , 0, n * sizeof(arr[0]));
    else{
        arr[str[6]-'0'-1]=1*brr[str[6]-'0'-1];
        if(brr[str[6]-'0'-1]==0)
            brr[str[6]-'0'-1]=1;
        else
            brr[str[6]-'0'-1]=0;
            }
    int c=0;
    for(int j=0;j<n;j++){
        if(arr[j]==1)
        c++;
    }
    cout << c << endl;
}

我一直面临的问题是输入。根据问题,输入命令可以是CLICK N,其中N是一个整数,或CLOSEALL(注意空格的确切大小写和数量)。每当我输入CLICK N时,程序运行良好,但是一旦我输入CLOSEALL,它就不执行块1(在代码中提到),程序立即终止,即使循环1(在代码中提到)必须继续直到k的输入值。我认为这是与getline()缓冲区相关的一些问题,因为CLOSEALL没有任何空格并且发生故障,而CLICK N有空格并且没有发生故障。有人能建议如何纠正这种冲洗差异,使代码完美地工作吗?

PS:我没有包括这个问题,因为我认为它在这里没有用。此外,我还根据需要在代码中包含了这些包。如果有人需要这个问题,我会编辑我的帖子。

你可以试试std::stringstream

// swapping ostringstream objects
#include <string>       // std::string
#include <iostream>     // std::cout
#include <sstream>      // std::stringstream
int main () {
  std::string str;
  std::cin >> str;
  std::stringstream ss;
  ss << str;
  int foo,bar;
  ss >> foo >> bar;
  std::cout << "foo: " << foo << 'n';
  std::cout << "bar: " << bar << 'n';
  return 0;
}
// in: 
// 100 200
// out: 
// foo: 100
// bar: 200

最新更新