48

"%*"scanf()のフォーマットの実際の使用法は何ですか。この形式が存在する場合、その背後に何らかの目的がなければなりません。次のプログラムは奇妙な出力を出します。

#include<stdio.h>
int main()
{
        int i;
        char str[1024];

        printf("Enter text: ");
        scanf("%*s", &str);
        printf("%s\n", str);

        printf("Enter interger: ");
        scanf("%*d", &i);
        printf("%d\n", i);
        return 0;
}

出力:

manav@workstation:~$ gcc -Wall -pedantic d.c
d.c: In function ‘main’:
d.c:8: warning: too many arguments for format
d.c:12: warning: too many arguments for format
manav@manav-workstation:~$ ./a.out
Enter text: manav
D
Enter interger: 12345
372
manav@workstation:~$
4

5 に答える 5

97

printf の場合、* を使用すると、追加のパラメーターを使用して最小フィールド幅を指定できます。たとえばprintf("%*d", 4, 100);、フィールド幅 4 を指定します。フィールド幅 4 は、数値の出力に 4 文字未満しかかからない場合、空白文字が出力されるまで出力されることを意味します。フィールド幅が埋まります。数値が指定されたフィールド幅よりも多くのスペースを占める場合、数値は切り捨てられずにそのまま印刷されます。

の場合scanf、* はフィールドが読み取られるが無視されることを示します。たとえばscanf("%*d %d", &i)、入力 "12 34" は 12 を無視し、34 を整数 i に読み取ります。

于 2010-01-28T15:21:13.870 に答える
21

星印はフラグ文字で、仕様によって読み取られたテキストを無視することを示します。glibc のドキュメントから引用するには:

オプションのフラグ文字 `*'。これは、この仕様のために読み取られるテキストを無視することを示します。scanf は、このフラグを使用する変換指定を見つけると、変換指定の残りの指示に従って入力を読み取りますが、この入力を破棄し、ポインター引数を使用せず、成功した割り当てのカウントをインクリメントしません。

これは、指定文字列に複数の要素が含まれる場合に役立ちます。たとえば scanf("%d %*s %d", &i, &j)"12 test 34"- の場合、ijは整数で、残りは無視したい場合です。

于 2010-01-28T15:20:23.507 に答える
6

*、変数に入力せずに入力をスキップするために使用されます。したがってscanf("%*d %d", &i);、2 つの整数を読み取り、2 番目の整数を に入れiます。

コードで出力された値は、初期化されていないi変数にあった値です。scanf 呼び出しはそれを変更しませんでした。

于 2010-01-28T15:20:08.483 に答える
6

こちらをご覧ください

オプションの開始アスタリスクは、データが stdin から取得されるが無視されることを示します。つまり、対応する引数には保存されません。

于 2010-01-28T15:20:35.713 に答える
3

scanf("%*d",&a) *入力をスキップします。 入力を読み取るには、エクストラ "%d"inを使用する必要がありscanfます。例えば:

 int a=1,b=2,c=3;
    scanf("%d %*d %d",&a,&b,&c); //input is given as: 10 20 30

O/p:

a=10 b=30 and c=3;  // 20 is skipped

別の例を使用する場合%d : scanf("%d %*d %d %d",&a,&b,&c); //input is given as: 10 20 30 40 a=10 b=30 c=40.

scanf で使用すると、 ie ","の後に値は取得されません。 O/p: a=10 b=2 c=3 が出力されます。%*dscanf("%d %*d,%d" &a,&b,&c)// 10 20 30

于 2013-09-23T15:49:41.643 に答える