C 在FGET不等待输入的情况下读取标准输入

C 在FGET不等待输入的情况下读取标准输入,c,string,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个,则显示两行。如果我键入1234

拥有这段代码:

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,然后按enter键,输入是否存储['1'、'2'、'\n'、'\0']或['1'、'2'、'3'、'\0']?如果我只按一次回车键,第二次达到printf时?。我怎样才能避免这种行为?我想输入123456,然后获得:

1234 

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

还要记住,
fgets
将拾取您在输入后按的
\n
(回车/返回)

要删除
\n
请执行以下操作:

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

您的<代码>存在一个主要问题,而状况。。。我不知道你想在那里做什么,但是
strcmp
用于查看两个字符串是否相同。。。您正在做的是尝试将字符串与某个对象的大小进行比较…

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

使用
scanf()
时,按enter键(换行符),该键的作用是接受输入并将输入从标准输入设备stdin传输到程序

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


fgetc(stdin)
getc(stdin)

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

  • 您不包括

  • 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;
}
#包括
#包括
内部主(空){
char-str[80];
while(fgets(str,sizeof(str),stdin)!=NULL){
str[strcspn(str,“\n”)]='\0';//如果存在换行符,则将其去掉
printf(“\n%s\n”,str);
如果(!strcmp(str,“q”));
打破
}
返回0;
}

但我只想存储用户输入的前4个字符。现在我的问题被编辑了,因为有一些印刷错误。你可以通过在
input
array:
fgets(input,sizeof(input),stdin)的5个索引处放置
NUL
L字符来实现这一点
输入[5]='\0'它不工作。如果我将str声明为char str[5],在fgets(str,sizeof(str),stdin)之后,我执行str[5]='\0',但同时执行两次包含printf的循环。@user2119381 Dude增大
str
。。。使输入缓冲区比最大的缓冲区大input@user2119381也将其更改为str[4]='\0';表达式
sizeof(“q\n”)
不返回字符串的长度
“q\n”
。程序在我键入“q”时结束。表达式
sizeof(“q\n”)
将返回
3
,即由文本字符串
“q\n”
创建的数组的大小,当然,还包含终止的
'\0'
字符。如果要获取字符串的长度,请使用
strlen
。永远!