头文件:#include <stdio.h>
scanf() 函数用来格式化输入数据,即按用户指定的格式从键盘上把数据读入到指定的变量中。其原型为:
int scanf ( char * format [ ,argument, ... ]);
其调用格式为: scanf("<格式化字符串>",<地址表>);
scanf()函数返回成功赋值的数据项数,出错时则返回EOF
【参数】format为格式化控制字符串,可以由三类字符构成。
1) 格式化说明符
另外,还有附加格式说明字符,用于追加在上面的格式说明符后面。
这里说下转换字符:[...]和[ ^...]。
一. [...]使用 输入数据为0984abcZXC
scanf() 函数用来格式化输入数据,即按用户指定的格式从键盘上把数据读入到指定的变量中。其原型为:
int scanf ( char * format [ ,argument, ... ]);
其调用格式为: scanf("<格式化字符串>",<地址表>);
scanf()函数返回成功赋值的数据项数,出错时则返回EOF
【参数】format为格式化控制字符串,可以由三类字符构成。
1) 格式化说明符
格式字符 | 说明 |
%a %A | 读入一个浮点值(仅C99有效) |
%c | 读入一个字符 |
%d | 读入十进制整数 |
%i | 读入十进制,八进制,十六进制整数 |
%o | 读入八进制整数 |
%x %X | 读入十六进制整数 |
%s | 读入一个字符串 |
%f %F | 读入一个浮点数 |
%e %E | 读入一个浮点数 |
%g %G | 读入一个浮点数 |
%p | 读入一个指针 |
%u | 读入一个无符号十进制整数 |
%n | 至此已读入值的等价字符数 |
%[] | 扫描字符集合 |
%% | 读%符号 |
另外,还有附加格式说明字符,用于追加在上面的格式说明符后面。
修饰符 | 说明 |
L\l | 长度修饰符,输入"长"数据 |
h | 长度修饰符,输入"短"数据 |
W | 整型常数,指定输入数据所占宽度 |
* | 星号,读入后不赋予任何变量 |
hh | 同 h,但仅对C99有效 |
ll | 同 l,但仅对C99有效 |
这里说下转换字符:[...]和[ ^...]。
一. [...]使用 输入数据为0984abcZXC
#include <stdio.h> main() { char strings[100]; printf( "input strings:\n"); scanf( "%[1234567890] ",strings);//这里用的是[1234567890] printf( "%s ",strings); } | #include <stdio.h> main() { char strings[100]; printf( "input strings:\n"); scanf( "%[0-9] ",strings); //这里用的是[0-9] printf( "%s ",strings); } |
输出:0984 | 输出:0984 |
通过运行可以发现它的作用是:如果输入的字符属于方括号内字符串中某个字符,那么就提取该字符;如果一经发现不属于就结束提取。该方法会自动加上一个字符串结束符到已经提取的字符后面。
scanf( "%[1234567890] ",strings)和scanf( "%[0-9] ",strings)是相同的,%[0-9]中的'-'是范围连接符。
常表示的有[0-9] 表示匹配0到9中任意数字,%[a-z] 表示匹配a到z中任意字符,%[A-Z] 表示匹配A到Z中任意字符,也可以[0-9a-zA-Z],也可以[0-5]表达。
2.%[^...]使用
^表示"非",即读入其后面的字符就结束读入。
取到指定字符为止的字符串。 如在下例中,取遇到空格为止字符串。 | 给定一个字符串iios/12DDWDFF@122, 获取 / 和 @ 之间的字符串,先将 "iios/"过滤掉,再将非'@'后的一串内容送到buf中 |
#include <stdio.h> main() { char strings[100]; printf( "input strings:\n"); scanf( "%[^ ]",strings); //输入1aB 4tC printf( "%s ",strings); } | #include <stdio.h> main() { char strings[100]; printf( "input strings:\n"); scanf( "%*[^/]/%[^@]",strings); //输入iios/12DDWDFF@122 printf( "%s ",strings); } |
输出:1aB | 输出:12DDWDFF |
通过运行可以发现它的作用是:如果输入的字符属于方括号内字符串中某个字符(空格),那么就停止提取该字符后的字符了。
在第二个实例scanf( "%*[^/]/%[^@]",strings); 中用到了“*”,在这里也解说下"*"表示读入后不赋予任何变量。也就是把前面讲到的字符过滤掉。
“%*[^/]/”意思为字符过滤到第一个"/"字符位置,前面的字符不显示,[^/]表示清除第一个"/"前的字符缓冲数据。