gpt4 book ai didi

c - fgets() 在 C 中无法正常工作

转载 作者:太空宇宙 更新时间:2023-11-04 00:59:40 24 4
gpt4 key购买 nike

给定以下代码:

#include <stdio.h>
int main()
{
int testcase;
char arr[30];
int f,F,m;
scanf("%d",&testcase);
while(testcase--)
{
printf("Enter the string\n");
fgets(arr,20,stdin);
printf("Enter a character\n");
F=getchar();
while((f=getchar())!=EOF && f!='\n')
;
putchar(F);
printf("\n");
printf("Enter a number\n");
scanf("%d",&m);
}
return 0;
}

我希望用户输入一个字符串、一个字符和一个数字,直到测试用例变为零。

我的疑问/问题:

1.用户无法输入字符串。似乎 fgets 不工作。为什么?

2.如果我使用 scanf 而不是 fgets,则 getchar 无法正常工作,即我在其中输入的任何字符 putchar 作为一个新行。为什么?

感谢您的帮助。

最佳答案

混合使用 fgets()scanf()getchar() 等函数很容易出错。 scanf() 函数通常在输入流中留下一个 \n 字符,而 fgets() 通常不会,这意味着下一个对 I/O 函数的调用可能需要也可能不需要处理先前调用留在输入流中的内容。

更好的解决方案是对所有用户输入使用一种类型的 I/O 函数。 fgets()sscanf() 结合使用对此效果很好。应该检查函数的返回值,如果发生错误,fgets() 会返回一个空指针; sscanf() 返回成功分配的次数,可用于验证输入是否符合预期。

这里是发布代码的修改版本。 fgets() 将输入存储在一个慷慨分配的缓冲区中;请注意,如果有足够的空间,此函数会将输入存储到并包括 \n 字符。如果希望输入的字符串不包含空格,可以使用sscanf()来提取字符串,不用担心换行符;同样,使用 sscanf() 提取字符或数字输入可以减轻代码进一步处理 \n 的负担。

#include <stdio.h>

int main(void)
{
int testcase;
char arr[30];
char F;
int m;
char buffer[1000];

do {
puts("Enter number of test cases:");
if (fgets(buffer, sizeof buffer, stdin) == NULL) {
/* handle error */
}
} while (sscanf(buffer, "%d", &testcase) != 1 || testcase < 0);

while(testcase--)
{
puts("Enter the string");
/* if string should not contain spaces... */
if (fgets(buffer, sizeof buffer, stdin) == NULL) {
/* handle error */
}
sscanf(buffer, "%29s", arr);
printf("You entered: %s\n", arr);
putchar('\n');

puts("Enter a character");
if (fgets(buffer, sizeof buffer, stdin) == NULL) {
/* handle error */
}
sscanf(buffer, "%c", &F);
printf("You entered: %c\n", F);
putchar('\n');

do {
puts("Enter a number");
if (fgets(buffer, sizeof buffer, stdin) == NULL) {
/* handle error */
}
} while (sscanf(buffer, "%d", &m) != 1);

printf("You entered: %d\n", m);
putchar('\n');
}

return 0;
}

另一方面,如果输入字符串可能包含空格,fgets() 可以将输入直接读入arr,但随后存储的字符串将包含一个 \n 字符,该字符可能应该被删除。一种方法是使用 strcspn() 函数查找 \n 的索引:

#include <string.h>  // for strcspn()
/* ... */
puts("Enter the string");
/* or, if string may contain spaces */
if (fgets(arr, sizeof arr, stdin) == NULL) {
/* handle error */
}
/* replace newline */
arr[strcspn(arr, "\r\n")] = '\0';

printf("You entered: %s\n", arr);
putchar('\n');
/* ... */

请注意,在将 %sscanf() 函数一起使用时,应始终指定最大宽度以避免缓冲区溢出。这里,读入arr时是%29s,因为arr可以容纳30个char,空格必须为空终止符 (\0) 保留。检查 sscanf() 的返回值以查看用户输入是否无效,在这种情况下会再次请求输入。如果测试用例数小于0,则必须重新输入。

关于c - fgets() 在 C 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45205624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com