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
。永远!