2

请帮助我理解下面的代码。该函数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] : '~' );
    }
}
4

1 回答 1

5

scanf ( "%1[0123456789]", ch )扫描 1 个字符 ( %1),这是一个十进制数字 ( [0123456789]) int 指向的字符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).

于 2012-04-20T07:53:29.500 回答