什么是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)
– 这里i & j是整数,希望忽略其余的。
看到这里
一个可选的起始星号表示数据将从标准input中被检索,但被忽略,即它不被存储在相应的参数中。
*
用于跳过input,而不用将其放入任何variables中。 所以scanf("%*d %d", &i);
会读两个整数,并把第二个在i
。
代码中输出的值只是未初始化的i
variables中的值 – 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将成为输出。