首页 > 解决方案 > 对于没有空格的输入,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:我没有包括这个问题,因为我认为这里没有用。此外,我已根据需要将这些包包含在我的代码中。如果有人需要这个问题,我会编辑我的帖子。

标签: c++buffercingetline

解决方案


你可以试试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


推荐阅读