在另一个字符串输入函数之后调用scanf()会创建幻象输入
这里有一个小程序:在另一个字符串输入函数之后调用scanf()会创建幻象输入,c,scanf,C,Scanf,这里有一个小程序: #include <stdio.h> int main() { char str[21], choice[21]; int size; while(1){ printf("$ "); fgets(str, 20, stdin); printf("Entered string: %s", str); if(str[0] == 'q') { printf("You sure? (y/n) "); sca
#include <stdio.h>
int main() {
char str[21], choice[21]; int size;
while(1){
printf("$ ");
fgets(str, 20, stdin);
printf("Entered string: %s", str);
if(str[0] == 'q') {
printf("You sure? (y/n) ");
scanf("%s", choice);
if(choice[0] == 'y' || choice[0] == 'Y')
break;
}
}
return 0;
}
注意$输入的字符串:
。很明显,fgets()
得到了一个空字符或一些东西作为输入,尽管我没有键入任何内容
发生了什么事?这是因为
scanf
调用读取一个字符,但将换行保留在缓冲区中。因此,当您下次调用fgets
is时,会找到一个换行符并读取它,从而导致读取一个空行
解决方案看似简单:在scanf
调用中的格式后面加一个空格:
scanf("%s ", choice);
/* ^ */
/* | */
/* Note space */
这将导致
scanf
读取并丢弃所有训练空格,包括换行符。这是因为scanf
调用读取字符,但将换行符留在缓冲区中。因此,当您下次调用fgets
is时,会找到一个换行符并读取它,从而导致读取一个空行
解决方案看似简单:在scanf
调用中的格式后面加一个空格:
scanf("%s ", choice);
/* ^ */
/* | */
/* Note space */
这将导致
scanf
读取并丢弃所有训练空格,包括换行符。如其他答案scanf
中所述,调用将换行符保留在输入缓冲区中,您也可以在scanf之后使用getchar()
,如下所示:
scanf("%20s", choice);// always remember( & good) to include field width
// in scanf while reading
fgets(str,sizeof str, stdin); //Its better
字符串,否则它将在大字符串的情况下覆盖缓冲区`
getchar(); //this will eat up the newline
此外,还应使用以下FGET:
scanf("%20s", choice);// always remember( & good) to include field width
// in scanf while reading
fgets(str,sizeof str, stdin); //Its better
如其他答案
scanf
中所述,call在输入缓冲区中保留换行符,您也可以在scanf之后使用getchar()
,如下所示:
scanf("%20s", choice);// always remember( & good) to include field width
// in scanf while reading
fgets(str,sizeof str, stdin); //Its better
字符串,否则它将在大字符串的情况下覆盖缓冲区`
getchar(); //this will eat up the newline
此外,还应使用以下FGET:
scanf("%20s", choice);// always remember( & good) to include field width
// in scanf while reading
fgets(str,sizeof str, stdin); //Its better
使用特定大小的“字符”
char选项[1]
或
使用特定大小的“字符”
char选项[1]
或
输入
q
时不会发生这种情况。fgets()也会读换行符。@KingsIndian是的,但问题是程序在scanf
调用后继续运行的情况,它确实会离开换行符。解释听起来不错(为什么我没有注意到换行符?facepalm),但解决方案不起作用。添加该空格后,scanf()
调用不会终止。我也尝试使用“%s\n”
添加,但这也没有终止。OP的问题和示例专门讨论了输入q
。我认为问题在别处。@Anubhav既然你只对一个字符感兴趣,为什么不扫描一个字符呢?试试看,例如,scanf(“%c”和char\u选项)代码>。可能会更好。输入q
时不会出现这种情况。fgets()也会读换行符。@KingsIndian是的,但问题是程序在scanf
调用后继续运行的情况,它确实会离开换行符。解释听起来不错(为什么我没有注意到换行符?facepalm),但解决方案不起作用。添加该空格后,scanf()
调用不会终止。我也尝试使用“%s\n”
添加,但这也没有终止。OP的问题和示例专门讨论了输入q
。我认为问题在别处。@Anubhav既然你只对一个字符感兴趣,为什么不扫描一个字符呢?试试看,例如,scanf(“%c”和char\u选项)代码>。可能更好。更好地使用int
进行choice
更好地使用int
进行choice
检查:对代码部分使用ctr+K
而不是“使用ctr+K
”。