了解scanf正在此代码中执行

时间:2012-04-20 07:51:27

标签: c scanf

请帮助我理解下面的代码。 函数get_digit按地址采用字符参数。我无法得到什么 scanf("%1[0123456789]", ch)在这里做。

如果我在终端上给出1234,那么它只需要第一个数字。同样如果我给2345它需要2.我从来没有遇到scanf的这种用法。请帮助我理解这个功能。

int get_digit ( char *ch )
{
    int rc;

    printf ( "Enter a single digit: " );
    fflush ( stdout );

    if ( rc = scanf ( "%1[0123456789]", ch ) == 1 ) {
        jsw_flush();
    }
    return rc;
}

void jsw_flush ( void )
{
    int ch;
    do
        ch = getchar();
    while ( ch != '\n' && ch != EOF );
    clearerr ( stdin );
}

void fill_table ( char table[] )
{
    char ch;
    while ( get_digit ( &ch ) ) {
        unsigned i =  ch - '0';
        if ( table[i] != 0 ) {
            printf ( "That index has been filled\n" );
        }
        else {
            table[i] = ch;
        }
    }
}

void show_table ( const char table[], size_t size )
{
    size_t i;
    for ( i = 0; i < size; i++ ) {
        printf ( "%c\n", table[i] != 0 ? table[i] : '~' );
    }
}

1 个答案:

答案 0 :(得分:5)

scanf ( "%1[0123456789]", ch )扫描1个字符(%1),它是[0123456789]指向的字符的十进制数字(ch)。

紧跟%之后的数字是字段宽度,要扫描的字符数(最大)。方括号内的字符是scanf将接受的字符。当遇到未列出的字符时,扫描结束。

扫描两位数字的一个非常简单的例子:

#include <stdlib.h>
#include <stdio.h>

int main(void) {
    char chs[2] = {0};   // space for two digits, zero-initialized
    unsigned u = 0, i;
    if (scanf("%2[0123456789]",&chs[0]) == 1) {
        // parse the number
        for(i = 0; i < 2 && chs[i]; ++i) {
            u = 10*u + chs[i] - '0';
        }
        printf("Got %u\n",u);
    } else {
        puts("Scan failed.");
    }
    return EXIT_SUCCESS;
}

当然,我们可以使字符数组比我们期望的数字长一些(零初始化!scanf不添加0终结符,而不是解析自己。格式化)并将解析保留为strtoul(chs,NULL,10)