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が指す文字の 10 進数字 ( [0123456789]) intである1 文字 ( ) をスキャンしますch

の直後の数字%は、フィールド幅、スキャンする (最大) 文字数です。角括弧内の文字scanfは、受け入れる文字です。リストされていない文字が検出されると、スキャンは終了します。

2 桁の数字をスキャンする非常に簡単な例:

#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;
}

もちろん、自分自身を解析する代わりに、文字配列を予想される数字よりも 1 つ長くして ( zero-initialise!scanfその形式では 0 ターミネータを追加しません)、解析を に任せることができますstrtoul(chs,NULL,10)

于 2012-04-20T07:53:29.500 に答える