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

49

"%*"

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

2
Manav,根据你最近的一些问题,你最好读一本教材。 - Alok Singhal
@Alok:我读过一本教材,但没有深入研究这些细节。大多数教材都没有提供适用于实时使用的示例。我认为最好的方法是阅读《C编译器设计》教材。 - manav m-n
4
你肯定不需要一本“C编译器设计”书。你试过K&R吗? - Alok Singhal
@Alok:我会开始阅读K&R,但我仍然觉得,如果没有足够的操作系统和“C编译器设计”的知识,C编程课程就是不完整的。 - manav m-n
3
@Manav: man 3 printf也可以回答你的问题。 - jamesdlin
5个回答

100

对于 printf,* 允许您通过额外的参数指定最小字段宽度,例如 printf("%*d", 4, 100); 指定了一个字段宽度为 4。字段宽度为 4 意味着如果数字打印所需的字符数少于 4 个,空格字符会被打印直到填满字段宽度。如果数字占用的空间大于指定的字段宽度,则该数字将原样打印,没有截断。

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


1
请将此代码“printf("%*d", 4, 100);”更改为“printf("%.*d", 4, 100);”,使用“.*”。 - SRIDHARAN
4
对于 scanf 函数,带有 * 的字段不会被计入返回值 - Bob Stein
什么是字段宽度? - Jananath Banuka
@JananathBanuka 的回答已更新,附加了一项解释该术语的示例。 - Håvard S
为什么要添加 printf()?它是完全不同的函数,也不是 OP 所要求的。这就像有人问关于 strstr(),而你却给出了 strchr() 的例子。作为一个事后的想法,你包含了请求信息。 - Deanie

25

星号是一个标记字符,它表示忽略规范读取的文本。 引用自glibc文档:

一个可选的标记字符“*”,它表示要忽略此规范读取的文本。当scanf找到使用这个标志的转换规范时,它按照转换规范的其余部分指示的方式读取输入,但是丢弃此输入,不使用指针参数,也不增加成功赋值的计数。

在规范字符串包含多个元素的情况下非常有用,例如: scanf("%d %*s %d", &i, &j) ,对于 "12 test 34" - 这里的ij是整数,您希望忽略其余部分。


9
*用于跳过输入而不将其放入任何变量中。因此,scanf("%*d %d", &i);会读取两个整数,并将第二个整数放入i中。
您代码中输出的值只是未初始化的i变量中的值- scanf调用没有改变它。

6

请参见此处

可选的起始星号表示要从stdin中检索数据但不使用,即它不会存储在相应的参数中。


4
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); //输入为:10 20 30 40,那么a=10,b=30,c=40。
如果在 scanf 中使用 ",",则在 %*d 后面不会取任何值,例如:scanf("%d %*d,%d" &a,&b,&c)// 10 20 30,输出结果为 a=10,b=2,c=3。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接