gets()不工作在第一次循环迭代中,但在后续迭代中工作

时间:2016-05-07 06:49:47

标签: c++ string stl gets

#include<bits/stdc++.h>
using namespace std;
//function to check for substring in a string

int check(const char* str,const char* substring)
{
    char* pos = strstr(str,substring);
    if(pos)
      return 1;
    else
      return 0;
}
int main(){
int t;
cin>>t;
while(t--)
{
    char inp [100000];
    cout<<"Enter String:";
    gets (inp);
    int rec,total=-1;
    puts(inp);
    rec = check(inp,"010");
    total = rec;
    rec = check(inp,"101");
    total = total +rec;
    if(total>0)
        cout<<"GOOD"<<endl;
    if(total==0)
    {
        cout<<"BAD"<<endl;

    }

}
return 0;
}

对于来自while循环的每次迭代调用,函数被调用两次。在while循环的第一次迭代中,对check()函数的调用在没有输入inp的情况下发生,并将其视为空字符串。在进一步的迭代中,inp取自用户,一切都开始正常工作。

1 个答案:

答案 0 :(得分:0)

gets读取一行,直到找到换行符\n为止。由于新行仍在前一次调用cin>>t的输入缓冲区中,因此对gets()的下一次调用将看到新行并返回而不读取任何内容。致电cin.ignore(INT_MAX,'\n')后,您需要致电cin>>t

cin>>t;
cin.ignore(INT_MAX,'\n');//this will remove everything up to and including a new line character from the input buffer
while(t--)
{
   ...//your other code
}

根据不相关的说明,如果您使用getline从流中读取一行并std::string接受输入而不是字符数组会更好(考虑如果用户会发生什么情况)输入超过1000个字符的字符串):

  #include <string>
  ....
  std::string inp;
  std::getline(cin,inp);//reads a line

  //if you don't want to modify your functions prototypes then you call your check function like
  rec = check(inp.c_str(),"010");//string::c_str() will return a c string

但如果您不想这样做,请至少使用fgets()指定要从流中读取的最大字符数,如:

 fgets(inp,1000,stdin);//will read at most 999 characters from the input stream