使用不等待输入的fgets读取标准输入

时间:2013-11-15 12:48:57

标签: c string

拥有这段代码:

int main(void)
{
    char str[4];

    do
    {
        if (fgets(str,sizeof(str),stdin) == NULL)
            break;
        printf("\n %s \n", str);
    }while (strncmp(str,"q\n",sizeof("q\n")));

    return 0;
}

如果我输入的字符超过4个,则会显示两行。如果我键入123456然后按回车键,输入存储['1','2','\ n','\ 0']或['1','2','3','\ 0'] ?如果我只按一次输入键,第二次到达printf?我怎么能避免这种行为?我想键入123456然后得到:

1234 

3 个答案:

答案 0 :(得分:1)

fgets仅读取部分输入的原因是str数组太小。您需要增加str数组的缓冲区大小。

另请注意,fgets会在您提供输入后选择\n(输入/返回)。

要摆脱\n这样做:

fgets(str,sizeof(str),stdin);
str[strlen(str)-1] = '\0';

您的while条件存在一个 MAJOR 问题...我不确定您尝试做什么,但strcmp用于查看是否有两个字符串是或否相同......你正在做的是尝试将字符串与某事物的大小进行比较......

答案 1 :(得分:0)

您的代码中存在多个问题:

  • 您不包含<stdio.h>

  • fgets()给出一个非常短的缓冲区:4个字节,一次只允许输入3个字符,包括'\n'。如果键入更多字符,它们将由终端和标准流库缓冲。需要多次调用fgets()才能全部读取它们,一次读取3个字节。

  • 您的终止测试是假的:strncmp(str, "q\n", sizeof("q\n"))fgets()读取的字符串与"q\n"进行比较,最多为3的字符数,因为sizeof("q\n") }计算q\n 空终止符。您应该使用strcmp()进行此测试。

  • 使用printf("\n %s \n", str);打印字符串。但请注意,读入str的常规行将包含尾随换行符,因此printf调用实际上会输出2行。

以下是修改后的版本:

#include <stdio.h>
#include <string.h>

int main(void) {
    char str[80];

    while (fgets(str, sizeof(str), stdin) != NULL) {
        str[strcspn(str, "\n")] = '\0';  // strip the newline if present
        printf("\n %s \n", str);
        if (!strcmp(str, "q"));
            break;
    }
    return 0;
}

答案 2 :(得分:-2)

在使用fgets()之前尝试使用getc()或fgetc()

当您使用scanf()时,按下输入键(换行符),其作为接受输入并将输入从标准输入(标准输入设备)传送到您的程序。

scanf()本身不会消耗按下的换行符。因此,我们需要一些接受此换行符的代码,并防止此换行符作为后续fgets()的输入。可以使用getc()fgetc()接受此换行符,该换行符应在fgets()之前写入。

fgetc(stdin);getc(stdin);