什么是scanf(“%* s”)和scanf(“%* d”)格式标识符?

时间:2010-01-28 15:16:27

标签: c formatting scanf

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:~$

5 个答案:

答案 0 :(得分:89)

对于printf,*允许您通过额外参数指定最小字段宽度,即printf("%*d", 4, 100);指定字段宽度为4.

对于scanf,*表示该字段将被读取但被忽略,因此输入“12 34”的scanf("%*d %d", &i)将忽略12并将34读入整数i。< / p>

答案 1 :(得分:19)

星号是一个标志字符,表示忽略规范读取的文本。 要从glibc文档中查询:

  

可选的标志字符“*”,表示忽略为此规范读取的文本。当scanf找到使用此标志的转换规范时,它会按照转换规范的其余部分的指示读取输入,但它会丢弃此输入,不使用指针参数,并且不会增加成功分配的计数。

在规范字符串包含多个元素的情况下,它很有用,例如:  scanf("%d %*s %d", &i, &j)的{​​{1}} - 其中 i &amp; j 是整数,你希望忽略其余的。

答案 2 :(得分:6)

请参阅here

  

可选的起始星号表示数据将从stdin中检索但被忽略,即它不存储在相应的参数中。

答案 3 :(得分:5)

*用于跳过输入而不将其放在任何变量中。因此scanf("%*d %d", &i);将读取两个整数,并将第二个整数放入i

代码中输出的值只是未初始化的i变量中的值 - scanf调用没有改变它。

答案 4 :(得分:2)

scanf("%*d",&a) *中跳过输入。为了阅读输入,必须在"%d"中使用额外的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中使用",",那么在%*d之后将不会采用任何值,即;     scanf("%d %*d,%d" &a,&b,&c)// 10 20 30     O / P:     a = 10 b = 2 c = 3将是输出。