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

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 dc dc: In function 'main': dc:8: warning: too many arguments for format dc:12: warning: too many arguments for format manav@manav-workstation:~$ ./a.out Enter text: manav D Enter interger: 12345 372 manav@workstation:~$ 

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

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

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

一个可选的标志字符“*”,它表示忽略为这个规范读取的文本。 当scanffind一个使用该标志的转换规范时,它按照转换规范的其余部分读取input,但是它放弃了这个input,不使用指针参数,也不增加成功赋值的次数。

当规范string包含多个元素时,例如: "12 test 34" scanf("%d %*s %d", &i, &j) – 这里ij是整数,希望忽略其余的。

看到这里

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

*用于跳过input,而不用将其放入任何variables中。 所以scanf("%*d %d", &i); 会读两个整数,并把第二个在i

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

scanf("%*d",&a) *跳过input。 为了读取input,必须在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 scanf("%d %*d %d %d",&a,&b,&c); //input is given as: 10 20 30 40然后a = 10 b = 30 c = 40。

如果你在scanf中使用","那么在%*d ie之后没有值。 scanf("%d %*d,%d" &a,&b,&c)// 10 20 30 O / p:a = 10 b = 2 c = 3将成为输出。