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 ответ

Решение

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
Другие вопросы по тегам