2016-05-07 3 views
0
#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; 
} 

Функция вызывался в два раза для каждой итерации вызова от времени loop.In первой итерации цикла While, вызов, чтобы проверить функцию() происходит без ввода inp, считая его пустой строкой. В дальнейших итерациях inp берется у пользователя, и все начинает работать должным образом.получает() не работает в первой итерации цикла, но работая в последующих итерациях

+0

Обязательно: никогда не используйте 'std :: gets' в любой реальной программе и, желательно, забывайте обо всем остальном, за исключением того, что вы никогда не должны его использовать. Потому что любая программа, использующая 'gets', может быть тривиально разбита (или даже использована,« взломана ») путем ввода пользователем. Кроме того, он был удален * из последнего стандарта C++. http://en.cppreference.com/w/cpp/io/c/gets – hyde

+0

Не знал об этом. Спасибо :) – rakeysh

ответ

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 
+0

Работал отлично. Спасибо :) – rakeysh