web-dev-qa-db-ja.com

scanf( "%* s")およびscanf( "%* d")形式の識別子とは何ですか?

フォーマットの実際の使用は何ですか"%*" in 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:~$
44
manav m-n

Printfの場合、*を使用すると、追加のパラメーターを使用して最小フィールド幅を指定できます。つまり、printf("%*d", 4, 100);はフィールド幅4を指定します。

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

89
Håvard S

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

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

仕様文字列に複数の要素が含まれる場合に便利です。例:scanf("%d %*s %d", &i, &j) for "12 test 34"-where ij =は整数であり、残りは無視したいです。

19
zacsek

こちら をご覧ください

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

6
Jon Cage

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

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

5
interjay

In scanf("%*d",&a)*は入力をスキップします。入力を読み取るためには、scanfで追加の"%d"を使用する必要があります。例えば:

 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で","を使用する場合、%*dの後に値は取得されません。 scanf("%d %*d,%d" &a,&b,&c)// 10 20 30 O/p:a = 10 b = 2 c = 3が出力されます。

2