拥有这段代码:
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
答案 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)
;