在另一个字符串输入函数之后调用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
”。