printf/sscanf 小用法

博客给出了三个宏定义PLOGI、PLOGD、PLOGE,用于格式化输出信息,还提及取字符串直到某个字符为止的操作,整体围绕Linux相关编程内容。
        int64_t t = 0LL;
        const char* str = "0-20201219-130902-423.H264 2536 1608354627399 0.046892";
        sscanf(s, "%*[^ ] %*[^ ] %" PRId64, &t);
可以得到1608354627399。
1.原样输出字符串:
    printf("%s", str);


2. 输出指定长度的字符串, 超长时不截断, 不足时右对齐:
    printf("%Ns", str);             --N 为指定长度的10进制数值


3. 输出指定长度的字符串, 超长时不截断, 不足时左对齐:
    printf("%-Ns", str);            --N 为指定长度的10进制数值


4. 输出指定长度的字符串, 超长时截断, 不足时右对齐:
    printf("%N.Ms", str);           --N 为最终的字符串输出长度
                                    --M 为从参数字符串中取出的子串长度


5. 输出指定长度的字符串, 超长时截断, 不足时左对齐是:
    printf("%-N.Ms", str);          --N 为最终的字符串输出长度
                                    --M 为从参数字符串中取出的子串长度

#define PLOGI(fmt, args…) printf(“[%08p:%-16.16s]:” #fmt “\n”, syscall(SYS_gettid), FUNCTION, ##args)
#define PLOGD(fmt, args…) printf(“[%08p:%-16.16s]:” #fmt “\n”, syscall(SYS_gettid), FUNCTION, ##args)
#define PLOGE(fmt, args…) printf(“[%08p:%-16.16s]:” #fmt “\n”, syscall(SYS_gettid), FUNCTION, ##args)

    // example: config write lockenv 118 3
    int n = sscanf(ptr, "%[^ ] %[^ ] %[^ ] %[^ ] %[^\n]", config, write, group, key, value);

取字符串直到某个字符为止

<think>我们之前已经详细讨论过sscanf的使用方法,但为了符合用户当前查询“详细使用方法”的要求,我们需要更全面、结构化地覆盖sscanf的核心功能、格式说明符、高级技巧和注意事项。同时,根据用户要求,最后必须输出3-5个相关问题,且以“§§相关问题§§”开头。 计划结构: 1. 核心功能概述 2. 基本语法 3. 格式说明符详解(表格+示例) 4. 高级用法(包括宽度控制、跳过元素、字符集合等) 5. 返回值与错误处理 6. 注意事项(安全、性能等) 7. 示例代码(多种场景) 8. 相关问题 注意:由于用户要求中文,所有内容使用中文。</think>`sscanf` 是 C 语言标准库中用于**从字符串格式化读取数据**的关键函数,以下是全面详细的使用指南: --- ### 一、核心语法结构 ```c #include <stdio.h> int sscanf(const char *str, // 源字符串 const char *format, // 格式控制字符串 ...); // 接收数据的变量地址列表 ``` **返回值**:成功匹配并赋值的参数个数(失败返回 EOF) --- ### 二、格式说明符详解 | 说明符 | 作用 | 示例 | |--------------|-----------------------|--------------------------| | `%d` | 十进制整数 | `int num;` | | `%u` | 无符号十进制整数 | `unsigned int u;` | | `%f`/`%lf` | float/double 浮点数 | `float f; double d;` | | `%c` | 单个字符 | `char ch;` | | `%s` | 字符串(空格截断) | `char str[20];` | | `%x`/`%X` | 十六进制整数 | `int hex;` | | `%o` | 八进制整数 | `int oct;` | | `%p` | 指针地址 | `void *ptr;` | | `%n` | 已读取字符计数 | `int count;` | | `%[]` | 字符集合匹配 | `char set[10];` | | `%%` | 匹配 % 字符本身 | | --- ### 三、高级控制技巧 #### 1. 宽度限制(防止溢出) ```c char data[] = "123456"; int val; sscanf(data, "%3d", &val); // 只取前3位,val=123 ``` #### 2. 字符集合匹配 ```c char log[] = "[Error:2023]"; char type[10], year[5]; // 匹配方括号内的非冒号字符 sscanf(log, "[%9[^:]:%4[^]]", type, year); // type="Error", year="2023" ``` #### 3. 跳过不需要的数据 ```c char csv[] = "John,25,USA"; char name[20]; int age; // 跳过逗号后的国家字段 sscanf(csv, "%19[^,],%d,%*s", name, &age); // name="John", age=25 ``` #### 4. 混合类型解析 ```c char data[] = "ID:0xA3F Status:Active"; int id; char status[10]; // 提取十六进制ID和状态字符串 sscanf(data, "ID:%x Status:%9s", &id, status); // id=0xA3F, status="Active" ``` --- ### 四、关键注意事项 1. **缓冲区安全** 始终指定字符串最大长度: `%19s` 代替 `%s`(目标数组长度=指定值+1) 2. **空白符处理** - 格式字符串中的空格匹配任意空白符(包括 `\t\n\r`) - `%c` 会读取空白符,需用 `" %c"` 跳过前导空白 3. **返回值验证** ```c int res = sscanf(input, "%d %f", &num, &fval); if(res != 2) { // 处理解析失败 } ``` 4. **特殊说明符** - `%n` 不消耗输入,记录当前位置: ```c int pos; sscanf("123abc", "%d%n", &num, &pos); // pos=3(123后的位置) ``` - `%*` 丢弃匹配项: ```c sscanf("A123", "%*c%d", &num); // 丢弃'A', num=123 ``` --- ### 五、实用代码示例 #### 1. 解析复杂日志 ```c char log[] = "2023-08-15 14:30 [WARN] sensor5: value=37.5C"; int year, month, day, hour, min; char level[10], sensor[10]; float value; sscanf(log, "%d-%d-%d %d:%d [%9[^]]] %9[^:]: value=%fC", &year, &month, &day, &hour, &min, level, sensor, &value); ``` #### 2. 安全解析用户输入 ```c char input[50]; fgets(input, sizeof(input), stdin); // 安全读取行 char name[20]; int age; // 带错误检查的解析 if(sscanf(input, "%19s %d", name, &age) != 2) { printf("Invalid input format!\n"); } ``` #### 3. 十六进制数据提取 ```c char hex_data[] = "Color: #FF00CC Alpha: 0x80"; unsigned int rgb, alpha; // 跳过#号读取十六进制 sscanf(hex_data, "Color: #%6x Alpha: %*3s%x", &rgb, &alpha); // rgb=0xFF00CC, alpha=0x80 ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值