C语⾔scanf函数转换说明表及其修饰符表
1. 对于上⼀篇⽂章,总结printf()输出,C库也包含了多个输⼊函数, scanf()是最常⽤的⼀个,也是经常与printf()经常⼀起搭配使⽤的函数之⼀.
scanf()和printf()类似, 也是使⽤格式字符串和参数列表. scanf中的格式字符串表明字符输⼊流的⽬标整数类型.两个函数主要的区别在参数列表中. printf()函数使⽤变量, 常量和表达式, ⽽scanf()函数使⽤指向变量的指针, 指针将在后续学习中总结. 使⽤scanf()有⼀下两个规则:
1 如果⽤scanf()读取基本变量类型的值, 在变量名前加上⼀个&;
2 如果⽤scanf()把字符串读⼊字符串数组中, 不要使⽤&.
举例⼀:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int age;
float assets;
char per[30];
printf("Enter your age,assets,and favorite\n");
scanf("%d",&age);
scanf("%f",&assets);
scanf("%s",per);
printf("%d, $%.2f %s\n",age,assets,per);
return0;
}
打印结果
Enter your age,assets,and favorite
27
43.25
apple
27, $43.25 APPLE
Program ended with exit code: 0
2. 总结完基本规则, 我们先把列表转换说明附上
ANSI C 中scanf基本转换说明
ANSI C 中scanf转换说明修饰符
3. 从scanf() ⾓度看输⼊
假设scanf()根据⼀个%d转换说明读取⼀个整数. scanf()函数每次读取⼀个字符, 跳过所有的空⽩字符, 直⾄遇到第⼀个⾮空⽩字符才开始读取. 因为要读取整数, 所以scanf()希望发现⼀个数字字符或者⼀个符号(+或-).如果遇到⼀个数字或符号, 它便保存该字符, 并读取下⼀个字符.如果下⼀个字符是数字, 它便保存该数字并读取下⼀个数字. scanf()不断第读取和保存, 直到遇到⾮数字字符. 如果读取到⼀个⾮数字字符, 它便认为读到了整数的末尾. 然后,scanf()把⾮数字字符放回输⼊. 这意味着程序在下⼀次读取输⼊时, ⾸先读到的是上⼀次丢弃的⾮数字字符. 最后, scanf()计算已读取数字(可能)相应的数值, 并将计算后值放⼊指定的变量中.
⽰例⼆:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int age;
char name[40];
scanf("%d",&age);
scanf("%s",name);
printf("%d,and %s \n", age,name);
return0;
}
打印结果
78 wuhan
78,and wuhan
Program ended with exit code: 0
4. 如果使⽤字段宽度, scanf()会在字段结尾或第⼀个空⽩字符处停⽌读取( 满⾜两个条件之⼀就停⽌)
#include <stdio.h>
c语言return的用法和搭配int main(int argc, const char * argv[]) {
char name[40];
scanf("%10s",name);
printf("%s \n",name);
return0;
}
在运⾏中输⼊ ‘wuhanHangzShanghai’,打印结果
wuhanHangz
5 如果使⽤%s转换说名, scanf()会读取除空⽩以外的所有字符. scanf()跳过空⽩字符开始读取第⼀个字符⾮空⽩字符. 并保存⾮空⽩字符直到遇到空⽩字符. 这意味这scanf()根据%s转换说明读取i⼀个单词, 即不包含空⽩字符的字符串.
如果使⽤字段宽度, scanf() 在字段末尾或者第⼀个空⽩字符处停⽌读取. ⽆法利⽤字段宽度让只有⼀个%s的scanf()读取多个单词. 最后注意⼀点: 当scanf()把字符串放进指定数组中时, 它会在字符序列末尾加上‘\0’, 让数组中的内容成为⼀个C字符串.
6 scanf()的返回值
scanf()函数返回成功读取的项数. 如果没有读取到如何项, 且需要读取⼀个数字⽽⽤户却输⼊⼀个⾮数字字符串, scanf()返回0.
当scanf() 检测到‘⽂件结尾’时, 会返回EOF (EOF是stdio.h中定义的特殊值, 通常⽤#define 指令把EOF定义为-1)
⽰例三:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int n1,n2,n3,m1,m2,s,num;
m1 = scanf("%d",&n1);
m2 = scanf("%d %d",&n2,&n3);
s = scanf("%d",&num);
printf("Enter number n1 = %d, n2 = %d, n3 = %d,num = %d\n",n1,n2,n3,num);
printf("scanf return m1 = %d, m2 = %d, s = %d\n",m1,m2,s);
return0;
}
输⼊‘12 45 678 string’, 打印结果
1245678string
Enter number n1 = 12, n2 = 45, n3 = 678,num = 0
scanf return m1 = 1, m2 = 2, s = 0
Program ended with exit code: 0
7 printf() 和 scanf() 的*修饰符
printf() 和 scanf() 都可以使⽤8修饰符来修改转换说明都含义. 但是, 他们都⽤法不太⼀样.
如果你不想预先设定指定字段宽度, 希望通过程序来指定, 那么可以⽤*修饰符代替字段宽度. 但还是要⽤⼀个参数告诉函数, 字段宽度应该是多少. 也就是说转换说明是%*d, 那么参数列表中应包含*和d对应都值. 这个技巧也可应⽤于浮点值指定精度和字段.
⽰例四:
#include <stdio.h>
int main(int argc, const char * argv[]) {
unsigned width,precision;
int number = 20;
double weight = 242.5;
printf("Enter a field width:\n");
scanf("%d",&width);
printf("The number is :%*d\n",width,number);
printf("Now enter a width and a precision:\n");
scanf("%d %d",&width,&precision);
printf("Weight = %*.*f.\n",width,precision,weight);
printf("Done\n");
return0;
}
打印结果
Enter a field width:
12 // 输⼊
The number is : 20
Now enter a width and a precision:
306 // 输⼊
Weight = 242.500000.
Done
Program ended with exit code: 0
scanf()中的*⽤法与此不同, 把*放在%和转换说明符之间,会使得scanf()跳过相应的输出项.
⽰例五:
#include <stdio.h>
int main(int argc, const char * argv[]) {
int n;
printf("Please enter three integers:\n");
scanf("%*d %d %*d",&n);
printf("The last integer was %d\n",n);
return0;
}
打印结果
Please enter three integers:
12 23 45 // 输⼊
The last integer was 23
Program ended with exit code: 0
⽰例六
int main(int argc, const char * argv[]) { int n;
printf("Please enter three integers:\n"); scanf("%*d %*d %d",&n);
printf("The last integer was %d\n",n); return0;
}
打印结果
Please enter three integers:
6578967 // 输⼊
The last integer was 967
Program ended with exit code: 0
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论