You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将指针引用的值存储到变量:C语言逗号分隔字符串解析

你原有代码存在两个核心错误导致无法正常工作:

  1. 格式字符串构造逻辑非法:strcat(strcat("%", params_sizes[0]), "u") 中,"%" 是只读的字符串常量,没有可写内存空间用于拼接,且数字类型的params_sizes[0]不能直接作为字符串传入strcat,最终生成的格式串完全不符合预期。
  2. 误用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 04:39:01