如何将指针引用的值存储到变量:C语言逗号分隔字符串解析
你原有代码存在两个核心错误导致无法正常工作:
- 格式字符串构造逻辑非法:
strcat(strcat("%", params_sizes[0]), "u")中,"%"是只读的字符串常量,没有可写内存空间用于拼接,且数字类型的params_sizes[0]不能直接作为字符串传入strcat,最终生成的格式串完全不符合预期。 - 误用
sscanf返回值:sscanf的返回值是成功匹配的参数个数,不是读取到的数值,你需要额外传入变量地址存储解析结果。
可行解决方案
实现逻辑
- 逐位遍历参数数组,若当前参数长度为0,直接赋值自定义默认值跳过解析
- 用
snprintf动态生成指定长度的格式化字符串,例如读取长度为N的无符号整数,格式串为%Nu - 调用
sscanf读取值,通过返回值判断是否解析成功,做异常兼容 - 如果需要适配不同参数类型,可额外维护一个参数类型数组,循环时根据类型选择格式串的后缀标识(如无符号数用
u、有符号数用d、字符串用s等),匹配对应类型的变量存储结果即可
示例代码
#include <stdio.h> #include <string.h> // 以下定义可根据你的实际场景调整 #define PARAM_COUNT 7 // 长度数组 int params_sizes[PARAM_COUNT] = {1,2,3,0,5,6,7}; // 参数起始指针数组 char* params_pointer[PARAM_COUNT] = { "1,22,333,,55555,666666,7777777", "22,333,,55555,666666,7777777", "333,,55555,666666,7777777", ",55555,666666,7777777", "55555,666666,7777777", "666666,7777777", "7777777" }; int main() { unsigned int parsed_result[PARAM_COUNT] = {0}; // 存储解析后的无符号数结果 char format_buf[16]; // 存储动态生成的格式串,空间足够容纳长度标识 for (int i = 0; i < PARAM_COUNT; i++) { // 处理空参数 if (params_sizes[i] == 0) { parsed_result[i] = 0; // 可自定义空参数的默认值 continue; } // 生成对应长度的格式串,%%是转义输出% snprintf(format_buf, sizeof(format_buf), "%%%uu", params_sizes[i]); // 传入变量地址读取值 int match_num = sscanf(params_pointer[i], format_buf, &parsed_result[i]); if (match_num != 1) { // 解析失败自定义处理逻辑,这里默认赋值0 parsed_result[i] = 0; } } // 测试输出 for (int i = 0; i < PARAM_COUNT; i++) { printf("第%d个参数解析结果:%u\n", i+1, parsed_result[i]); } return 0; }
内容的提问来源于stack exchange,提问作者Clément
相关产品推荐
相关产品推荐

