首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何避免在使用getchar()清除输入缓冲区时按两次enter?

如何避免在使用getchar()清除输入缓冲区时按两次enter?
EN

Stack Overflow用户
提问于 2018-07-08 06:59:22
回答 2查看 1.1K关注 0票数 2

我有这个程序:

代码语言:javascript
复制
#include <stdio.h>
#define SIZE 19

int main(){

char string[SIZE];

while (string[0] != 'A'){
 printf("\nEnter a new string.\n");
 fgets(string,SIZE,stdin);

 int storage = 0;
 while (storage != '\n') 
 {
   storage = getchar(); 
 }
 }
 }

如果输入的字符串超过了string[]可以容纳的最大字符数,则存在带有getchar()的嵌套while循环。如果不存在,输入一个字符串,例如20个字符,将导致输出为:

代码语言:javascript
复制
Enter a new string.
12345123451234512345

Enter a new string.

Enter a new string.

问题是,这需要我按两次enter键才能输入一个新字符串:一次用于'fgets‘,另一次用于嵌套的while循环(这是我对所发生的事情的理解)。

有没有办法改变这一点,让我只需按回车键一次,或者有可能把整个while循环变成更优雅的东西?

EN

回答 2

Stack Overflow用户

发布于 2018-07-08 07:06:27

如果从fgets接收的缓冲区包含换行符,您知道它会读取输入的所有内容,因此您不需要执行任何其他操作。如果不是,则使用额外的循环来刷新缓冲区。

票数 1
EN

Stack Overflow用户

发布于 2018-07-08 08:03:07

如果(且仅当)缓冲区足够长,可以到达并包含换行符,以及尾随的nul结束符,则fgets()会读取换行符。

您的示例输入是20个字符,后面是一个换行符,然后是nul结束符。它不会进入19个字符的缓冲区。

简单的方法是在循环中使用fgets(),直到换行符包含在缓冲区中。

代码语言:javascript
复制
printf("\nEnter a new string.\n");
do
{
     fgets(string,SIZE,stdin);
       /* 
            handle the input, noting it may or may not include a trailing '\n'
            before the terminating nul
       */
} while (strlen(string) > 0 && string[strlen(string) - 1] != '\n');

此循环将清除第一个换行符之前的输入,还允许您显式处理(如果需要,则丢弃)所有接收到的输入。因此,没有必要对getchar()使用第二个循环。

您还没有检查fgets()是否返回NULL,因此I也没有。建议您检查一下,因为这样可以在输入时指出错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51227542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档