sscanf 函数的使用和格式详解
sscanf 函数是 C 语言中的一个输入函数,用于从一个字符串中读取数据并将其存储到变量中。函数原型为 `int sscanf(string str, string fmt, mixed var1, mixed var2 ...);`。sscanf 函数与 scanf 函数类似,都是用于输入的,但是 scanf 函数以屏幕(stdin)为输入源,而 sscanf 函数以固定字符串为输入源。
格式字符串(fmt)是 sscanf 函数的核心部分,用于指定输入的格式。格式字符串由多个部分组成:
1. `%`:表示格式符的开始
2. `*`:可选,表示跳过此数据不读入
3. `width`:可选,表示读取宽度
4. `size`:可选,表示参数的大小,常用的有 `hh`(单字节)、`h`(2 字节)等
5. `type`:必选,表示参数的类型,例如 `%s`(字符串)、`%d`(十进制整数)等
常见的类型包括:
* `%c`:一个单一的字符
* `%d`:一个十进制整数
* `%i`:一个整数
* `%e`, `%f`, `%g`:一个浮点数
* `%o`:一个八进制数
* `%s`:一个字符串
* `%x`:一个十六进制数
* `%p`:一个指针
* `%n`:一个等于读取字符数量的整数
* `%u`:一个无符号整数
* `%[]`:一个字符集
* `%%`:一个精度符
特别的格式符包括:
* `%*[width] [{h | l | I64 | L}]type`:表示满足该条件的被过滤掉,不会向目标参数中写入值
* `%[a-z]`:匹配 a 到 z 中任意字符,贪婪性
* `%[aB']`:匹配 a、B、' 中的一员,贪婪性
* `%[^a]`:匹配非 a 的任意字符,贪婪性
使用 sscanf 函数时,需要注意以下几点:
* sscanf 函数的返回值表示成功匹配的参数个数
* sscanf 函数可以使用多个参数,参数之间用逗号分隔
* sscanf 函数可以使用星号(*)来跳过某些数据
下面是一些示例代码:
1. 普通的字符串读取:
```c
char buf[512] = {0};
sscanf("123456 asdf", "%s", buf);
printf("%s\n", buf); // 输出:123456
```
2. 取指定长度的字符串:
```c
char buf[512] = {0};
sscanf("123456 ", "%4s", buf);
printf("%s\n", buf); // 输出:1234
```
3. 取到指定字符为止的字符串:
```c
char buf[512] = {0};
sscanf("123456 abcdedf", "%[^ ]", buf);
printf("%s\n", buf); // 输出:123456
```
4. 取仅包含指定字符集的字符串:
```c
char buf[512] = {0};
sscanf("123456abcdedfBCDEFxyz", "%[1-9a-z]", buf);
printf("%s\n", buf); // 输出:123456abcdedf
```
5. 取到指定字符集为止的字符串:
```c
char buf[512] = {0};
sscanf("123456 abcdedfBCDEFxyz", "%[^A-Z]", buf);
printf("%s\n", buf); // 输出:123456 abcdedf
```
6. 取到指定字符之间的字符串:
```c
char buf[512] = {0};
sscanf("iios/12DDWDFF@122", "%*[^/]/%[^@]", buf);
printf("%s\n", buf); // 输出:12DDWDFF
```
7. 取仅保留某个字符串:
```c
char buf[512] = {0};
sscanf("hello, world", "%*s%s", buf);
printf("%s\n", buf); // 输出:world
```
这些示例代码展示了 sscanf 函数的多种用法和格式符的使用。