C语言中sscanf函数的简明教程
函数定义
int sscanf(const char *str, const char * format, ...);
函数说明
sscanf()
定义于头文件stdio.h
。sscanf()
会将参数str
的字符串根据参数format
字符串来转换并格式化数据。格式转换形式请参考scanf()
。转换后的结果存于对应的参数内。
返回值
成功则返回参数数目,失败则返回-1
(也即EOF
)。
参数中format的说明
format中可以包含一个或多个{%[*][width][length]specifier|' '|'\t'|'\n'|所有非%符号}
注:{a|b|c}表示a,b,c中选一,[d],表示可以有d也可以没有d。
- width:宽度,忽略则为贪婪模式
- length:对specifier进行修饰,指定存储类型,可选值有
hh
、h
、l
、ll
、j
、z
、t
、L
- specifier:参考scanf中的specifier
length
和specifier
组合所指定的存储类型表:
注:黄色行表示实现标准为C99
支持集合操作:
- %[a-z] 表示匹配a到z中任意字符,贪婪性(尽可能多的匹配)
- %[aB’] 匹配a、B、'中一员,贪婪性
- %[^a] 匹配非a的任意字符,贪婪性
- %*[^=] 匹配=之前的字符串并跳过
注:集合操作的存储格式只能为char*或wchar_t*,即不能用%[0-9]接收并存储为int*
例子
- 贪婪模式(省略
width
)
char result[100];
sscanf("helloworld", "%s", result);
printf("%s", result); // helloworld
- 限定长度
char result[100];
sscanf("helloworld", "%5s", result); // 限定长度为5的字符串
printf("%s", result); // hello
- 指定
length
和specifier
long long result;
sscanf("8888888888888", "%lld", &result); // 存储类型为long long int
printf("%lld", result); // 8888888888888
- 接收但忽略部分字符
char result[100];
sscanf("helloworld", "%*5s %s", result); // %*5s表示接收但忽略5个字符,%s表示接收剩下的字符,format中的空格会被忽略
printf("%s", result); // world
- 集合操作
char result[100];
sscanf("abcdefg8888abc", "%[abc]", result);
// 每个字符只能是a、b、c中的一个,一旦不满足则接收(忽略后面的所有字符,即使可能会再次满足条件)
printf("%s", result); // abc
- 指定长度的集合操作
char result[100];
sscanf("ab12cdefg", "%5[a-z0-9]", result); // 接收长度为5并且由a到z、0到9字符组成的字符串
printf("%s", result); // ab12c
- 排除部分字符
char result[100];
sscanf("abcdefg", "%[^d-f]", result); // 接收由非d、e、f字符组成的字符串
printf("%s", result); // abc
- 同时接收多个变量
char name[100];
int age;
sscanf("name=zhangsan;age=24", "%*[^=] = %[^;] ; age=%d", name, &age); // 分别接收name和age并按指定格式存储
printf("%s\n", name); // zhangsan
printf("%d\n", age); // 24