c - gets() 函数从第二次开始被跳过

标签 c goto gets

我正在使用 C 语言并编写了以下代码:

   1 #include<stdio.h>
   2 #define ASK_PROMPT printf("\nDo you want to continue(Y/N):");
   3 main()
   4 {
   5    char main[20], i;
   6    start:
   7    printf("Please enter your string:\n");
   8    gets(main);
   9    printf("\nstring entered was:\n \n%s\n", main);
   10   ASK_PROMPT;
   11   scanf("%c",&i);
   12       
   13   if(i=='Y'||i=='y')
   14       goto start;
   15   getch();
   16   return;
   17 }

当我执行此代码时,goto 循环 无法正常工作。在对第 10 行提出的问题提供 yY 响应时,循环确实有效,并且第 7 行再次执行/打印,但第 8 行被跳过(不等待提供输入)。

  • 谁能解释一下为什么会发生这种情况?
  • 如何修复它?

最佳答案

我建议不要使用gets。使用gets时,如果输入的字符串大于main[的大小怎么办? 20] .gets 不会阻止这种情况,并且会导致 UB

使用fgets-

fgets(main,20,stdin);

问题的原因是 scanf("%c",&i); 之后的 '\n' 仍保留在 stdin 中> 在遇到 '\n' 时导致 gets 返回。

为了避免 '\n',您可以在 scanf 语句之后执行此操作 -

int c;
while ( (c = getchar()) != EOF && c != '\n' );

关于c - gets() 函数从第二次开始被跳过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32502613/

相关文章:

loops - 标签 - break vs continue vs goto

c - 如何在C中读取一行中的多个字符串,每个字符串都包含空格?

c - 如何使 gets() 仅等待特定时间以获取来自 C 中 STDIN 的输入?

c - 函数参数和局部变量如何影响 C 程序的性能

java - c和java链表的区别

c - 转到函数外部嵌入式 C 中的行号

c - 为什么gets 函数如此危险以至于不应该使用它?

c - C 中的二维数组,地址生成

c - 如何在c中使用gethostbyname

java - Java字节码中 "GOTO"后面的数字是什么?