gpt4 book ai didi

C scanf() 和 fgets() 问题

转载 作者:太空狗 更新时间:2023-10-29 15:59:38 24 4
gpt4 key购买 nike

我正在尝试读取用户输入并将其存储为包含空格的字符串。我搜索了一个解决方案并指向 fgets() 或 scanf(%[^\n], str)。但是这两种解决方案都给我一个错误。

这是我的:

//MAX_CHARACTERS is set to 30

scanf("%d", &input);
if (input == 1){
int pr;
char na[MAX_CHARACTERS+1];
printf("\nEnter the name: ");
scanf("%[^\t\n]", &na);
while (strlen(na)>MAX_CHARACTERS){
printf("\nName is too long, enter new name: ");
scanf("%[^\t\n]", &na);
}// end na check
printf("\nEnter priority: ");
scanf("%d", &pr);
while (pr>MAX_PRIORITY || pr <MIN_PRIORITY){
printf("\nBad priority, enter new priority (0-100): ");
scanf("%d", &pr);
}//end pr check

如果我在 %[^\t\n] 的所有实例中使用 %s 它工作正常但是当我使用 %[^\t\n]

fgets(na, 30, stdin),它跳过名称的第一个 scanf 并直接进入“输入优先级:”。然后,当我打印时,无论我输入什么优先级,我都会得到一个空白名称。

编辑:抱歉,第一个 scanf 中缺少的引号是错字。不是问题的原因。我为第一个 scanf("%d", input) 输入了'1'。

已修复

因为它还不允许我发布答案,

有人想通了。如果有人仍然感兴趣,问题是第一个 scanf()。

scanf("%d", &input);

它在缓冲区中留下一个\n。第二个是获取\n 并将其作为输入读取,因此它会被跳过。

解决方案:

放一个

fflush(stdin); //right after the if statement seems to have fixed the issue. 

感谢大家的帮助。

最佳答案

这是使用 scanf() 接收用户输入的问题,它不是用来处理字符串或任何错误输入的。 scanf() 用于读取格式化输入(例如,具有严格和特定格式的文件)。当接受来自用户的输入时,输入可能是畸形的并导致问题。 您应该使用 fgets() 读取输入并自行解析。

要回答为什么第二个 scanf() 调用被跳过,这是因为第一个调用只消耗输入的数字。但是,按 Enter 后的换行符保留在输入缓冲区中,并且是第二次调用的输入。要解决此问题,您需要从输入缓冲区中删除该换行符。最安全的方法是使用 getchar() 直到换行符被读取,然后继续您的程序。并避免使用 fflush(stdin) 模式,这不安全并且可能导致更多问题。

这是一个简单的函数,您可以使用它来读取字符直到读取到换行符:

void clear_newlines(void)
{
int c;
do
{
c = getchar();
} while (c != '\n' && c != EOF);
}

在您处理非字符串数据的任何调用 scanf() 之后调用它。

关于C scanf() 和 fgets() 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7060573/

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