【问题标题】:C - While-Loop Duplicating Print StatementsC - While-Loop 复制打印语句
【发布时间】:2016-04-23 16:38:36
【问题描述】:

当 while 循环在第一次之后运行时,它会在从标准输入获取用户输入之前两次打印我的“创建新节点”提示。为什么是这样?查看链接图片。

代码:

int main()
{
  char userInput[2];
  while(1)
  {
    printf("\nCreate new node? (y/n)\n");
    printf(">>> ");
    fgets(userInput, 2, stdin);

    if(strcmp(userInput, "y") == 0)
    {
        printf("Yes\n");
    }

    else if(strcmp(userInput, "n") == 0)
    {
        printf("No\n");
        exit(0);
    }
  }
}

终端输出:

【问题讨论】:

  • 您应该将文本作为文本而不是图像发布!
  • 在调用fgets() 时应始终检查 (!=NULL) 返回值以确保操作成功。
  • 数组:userInput 只有两个字符长。因此,使用fgets() 一次只能从标准输入中使用一个字符。这意味着如果用户输入:n<cr>n 将被消耗,然后在下一个循环中,<cr> 将被消耗,代码将再次循环以获取用户的下一个实际输入。建议将userInput[] 加长几个字符,比如加长2 或3 个字符。
  • 使用户能够输入YN 在调用fgets() 之后和第一个if() 之前插入对tolower() 的调用注意:tolower() 的原型是
  • 续。 tolower() 函数将要处理(并返回)int 而不是char,因此建议使用此行输入来自用户的值:while( (userInput = getchar()) == EOF || '\n' == userInput ); 并将“userInput”声明为:int userInput;

标签: c while-loop stdin fgets


【解决方案1】:

fgets 读取字符串加上'\0' 加上'\n'。由于userInput 只有2 字节,'\n' 不会被fgets 读取,而是会出现在输入缓冲区中。在下一次迭代中,fgets 将读取上一次调用 fgets 留下的 '\n'

增加缓冲区大小,你就没有问题了

char userInput[3];  

或者你可以放

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

就在fgets 声明之后。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-21
    • 2021-09-12
    • 2023-03-09
    • 2016-07-02
    • 2021-11-06
    • 2011-04-18
    • 2021-01-01
    • 2020-09-19
    相关资源
    最近更新 更多