这是一个我最近一直面临困难的代码-
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