gets() 在第一次循环迭代中不起作用,但在后续迭代中起作用
gets() not working In first loop iteration but working in subsequent iterations
#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 loop.In while 循环的第一次迭代开始,每次迭代调用都会调用该函数两次,调用 check() 函数时无需输入 inp,将其视为空字符串。在进一步的迭代中,inp 是从用户那里获取的,一切都开始正常工作。
gets
读取一行,直到找到新行字符 \n
。由于上一次调用 cin>>t
的新行仍在输入缓冲区中,因此下一次调用 gets()
将看到该新行,而 return 不会读取任何内容。您需要在调用 cin>>t
.
之后调用 cin.ignore(INT_MAX,'\n')
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
#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 loop.In while 循环的第一次迭代开始,每次迭代调用都会调用该函数两次,调用 check() 函数时无需输入 inp,将其视为空字符串。在进一步的迭代中,inp 是从用户那里获取的,一切都开始正常工作。
gets
读取一行,直到找到新行字符 \n
。由于上一次调用 cin>>t
的新行仍在输入缓冲区中,因此下一次调用 gets()
将看到该新行,而 return 不会读取任何内容。您需要在调用 cin>>t
.
cin.ignore(INT_MAX,'\n')
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