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

man*_*m-n 44 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

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:~$
Run Code Online (Sandbox Code Playgroud)

Håv*_*d S 91

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

因为scanf,*表示要读取但忽略该字段,因此scanf("%*d %d", &i)对于输入"12 34"将忽略12并将34读入整数i.

  • 对于“scanf”,带有“*”的字段**不计入返回值**。 (4认同)

zac*_*sek 19

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

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

它在规范字符串包含多个元素的情况下很有用,例如:scanf("%d %*s %d", &i, &j)对于"12 test 34"- 其中ij是整数,并且您希望忽略其余的元素 .


Jon*_*age 6

看到这里

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


int*_*jay 5

所述*用于跳过的输入而不把它在任何变量.所以scanf("%*d %d", &i);会读取两个整数并将第二个整数放入i.

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