C scanf()和fgets()问题

时间:2011-08-14 23:57:24

标签: c scanf fgets

我正在尝试读取用户输入并将其存储为包含空格的字符串。我搜索了一个解决方案,并指向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

如果我在%s的所有实例中使用%[^\t\n]但我使用%[^\t\n]

时,它可以正常工作

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

编辑:抱歉,第一个scanf上缺少的引号是拼写错误。不是问题的原因。我输入'1'作为第一个scanf(“%d”,输入)。

固定IT

因为它不会让我发布答案,

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

scanf("%d", &input);

它在缓冲区中留下\ n。第二个是取\ n并将其作为输入读取,以便跳过它。

解:

提出

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

感谢大家的帮助。

4 个答案:

答案 0 :(得分:6)

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

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

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

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

在对您处理非字符串数据的scanf()进行任何调用后调用此方法。

答案 1 :(得分:2)

    scanf("%d",&choice);
    fgetc(stdin);

我所做的是从stdin读取fgetc,然后离开'\ n',这样你的缓冲区就是crear。

答案 2 :(得分:0)

代码的第一行:

scanf(%d, &input);

应该是:

scanf("%d", &input);

即。引号丢失

答案 3 :(得分:0)

scanf("%[^\t\n]", &na);

应该是:

scanf("%[^\t\n]", na);

即,删除&amp;

此外,fgets应该可以正常工作,除非它包含用户按Enter键时的换行符。你将不得不剥离它。