2010-01-28 58 views
43

scanf()中格式"%*"的实际用法是什么?如果这种格式存在,它必须有一些目的。下面的程序给出了奇怪的输出。什么是scanf(“%* s”)和scanf(“%* d”)格式标识符?

#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; 
} 

输出:

[email protected]:~$ 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 
[email protected]:~$ ./a.out 
Enter text: manav 
D 
Enter interger: 12345 
372 
[email protected]:~$ 
+0

马纳夫,根据你最近的一些问题,你会很好地阅读一本教科书。 – 2010-01-28 15:20:48

+0

@Alok:好的,我已经阅读了一本教科书,但没有进入这些细节。大多数教科书不提供适合实时使用的示例。我认为,最好的做法是阅读“C编译器设计”教科书。 – 2010-01-28 15:29:40

+1

@Manav:你绝对不需要“C编译器设计”一书。你尝试过K&R吗? – 2010-01-28 15:33:10

回答

83

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

场宽度。scanf,*表示该字段是要被读取但忽略,因此,即输入“12 34”的scanf("%*d %d", &i)将忽略12并将34读入整数i。

+0

请更改此“printf(”%* d“,4,100);”到“printf(”%。* d“,4,100);” *应该被使用。 – Sridharan 2017-07-20 05:42:13

5

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

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

18

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

一个可选的标志字符'*”,它说忽略阅读本说明书中的文字。当scanf找到使用该标志的转换规范时,它将按照转换规范的其余部分读取输入,但会丢弃该输入,不使用指针参数,也不会增加成功分配的计数。

在规范字符串中包含多个元素,如: scanf("%d %*s %d", &i, &j)"12 test 34"它是在情况下非常有用 - 在 & Ĵ是整数,你希望忽略休息。

6

参见here

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

2

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将是输出。

相关问题