如何在C中使用scanf设置部分默认输入?

时间:2015-09-16 02:37:50

标签: c scanf

我是编程新手,我正在编写一个程序,将十进制转换为二进制数字分析课程。我对如何处理变量形式的输入有点困惑。例如,输入可以是以下两种形式之一:

Input: 15Input: 15 / 2

如果它只是两种情况中的一种,我知道如何处理输入:

分别为

scanf("%d", &userInput);scanf("%d / %d", &numerIn, &denomIn);

我尝试了许多没有运气的战术。我接近以下内容:

    (1)    int numerIn, denomIn = 1;        
    (2)    printf("Enter decimal number: ");
    (3)    scanf("%d", &numerIn);
    (4)    if (!feof(stdin)) {
    (5)       scanf(" / %d", &denomIn);
    (6)    }

不幸的是,这并没有顺利进行。我已经尝试在%d&之前和之后以及在第3和第5行中使用不同的空格组合,但无济于事。我也认为可能有一些方法来编写程序,如果在第一个整数后没有输入任何东西,程序可以知道自动默认使用denomIn中的默认值1,但我可以'无论如何都要想出来。

有没有办法解决我忽略的这个要求?我对C编程非常陌生,所以我很可能在这里犯了一个令人尴尬的新手错误。话虽如此,是否有任何好文章可以准确解释输入缓冲区的工作原理?这对我来说有点混乱。

提前致谢!任何见解都会在这一点上受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

  1. 使用fgets阅读整行。

  2. 使用strtok来解析该行。

  3. 指向fgetsstrtok的链接提供了可用作起点的示例代码。

答案 1 :(得分:1)

请注意scanf不是我在生产程序中使用的东西。它太脆弱了。但是对于简单的测试程序,它比编写自己的解析器更方便。

使用scanf的好处是它可以处理空白变化,并进行数字转换,同时处理轻微的解析任务,例如查找'/'字符

使用scanf的缺点是,如果输入有问题,scanf很有可能无法检测到它,scanf将离开的可能性相同stdin处于未知状态(需要额外的代码来清理混乱)。

解决scanf's糟糕错误处理的一种方法是使用fgets读取一行用户输入,然后使用sscanf来解析该行。这样,如果出现问题,至少stdin将处于已知状态。

以下代码演示了如何使用fgetssscanf来获取用户输入。首先fgetsstdin读取一行输入并将其放入数组line。如果fgets在读取任何字符之前遇到文件结尾,它将返回NULL,程序将退出。

接下来,调用sscanf来解析该行并提取分子和分母。如果只找到分子,sscanf将返回1。如果它同时找到分子和分母,它将返回2。请注意,格式为"%d /%d"的斜杠前面的空格很重要。它告诉sscanf在查找斜杠时跳过空格。

程序的其余部分只是将用户输入回送到输出。

#include <stdio.h>

int main( void )
{
    int numer, denom, count;
    char line[64];

    for (;;)
    {
        printf( "Enter decimal number: " );
        fflush( stdout );

        if ( fgets( line, sizeof line, stdin ) == NULL ) {
            printf( "Bye\n" );
            break;
        }

        count = sscanf( line, "%d /%d", &numer, &denom );

        if ( count == 1 ) {
            denom = 1;
            printf( "You entered %d\n", numer );
        }
        else if ( count == 2 ) {
            printf( "You entered %d/%d\n", numer, denom );
        }
        else {
            printf( "You entered garbage\n" );
        }
    }
}