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);会读取两个整数并将第二个放入i.

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

于 2010-01-28T15:20:08.483 回答
6

这里

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

于 2010-01-28T15:20:35.713 回答
3

In 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

开/关:

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

如果你使用另一个%d ie: 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 回答