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

C语言如何用strtok()和strtod()拆分命令行传入的9个double类型数值

C语言解析冒号分隔的9个double型卷积核参数实现方案

核心实现思路

  • 预定义3*3的double数组存储最终参数(9个数值刚好匹配3x3卷积核尺寸,适配后续图像像素处理需求)
  • 循环调用strtok()按冒号分割字符串,首次调用传参为原参数字符串,后续调用传参为NULL
  • 每分割出一个子串就调用strtod()做数值转换,同时做转换合法性、参数数量、数值范围三重校验

完整实现代码

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

// 全局/局部3x3卷积核数组,存储解析后的9个double值
double kernel[3][3];

int parse_kernel(char *kArg) {
    char *token;
    char *end;
    int idx = 0;
    // 首次调用strtok按冒号分割
    token = strtok(kArg, ":");
    while (token != NULL && idx < 9) {
        double val = strtod(token, &end);
        // 校验当前子串是否为合法浮点数
        if (end == token) {
            fprintf(stderr, "参数错误:第%d个数值不是合法浮点数\n", idx + 1);
            return -1;
        }
        // 校验数值是否在0~255的合法输入范围内
        if (val < 0.0 || val > 255.0) {
            fprintf(stderr, "参数错误:第%d个数值%.2f超出0~255的允许范围\n", idx + 1, val);
            return -1;
        }
        // 按行优先规则存入3x3数组,和输入顺序一一对应
        kernel[idx / 3][idx % 3] = val;
        idx++;
        // 后续分割调用strtok传NULL即可
        token = strtok(NULL, ":");
    }
    // 校验是否刚好解析到9个合法数值
    if (idx != 9) {
        fprintf(stderr, "参数错误:需要9个数值,实际仅解析到%d个\n", idx);
        return -1;
    }
    return 0;
}

// 调用示例
int main(int argc, char *argv[]) {
    // 此处替换为你从命令行-k参数拿到的实际输入字符串
    char kArg[] = "0.0:-1.0:0.0:-1.0:4.0:-1.0:0.0:-1.0:0.0";
    if (parse_kernel(kArg) != 0) {
        // 自定义错误处理逻辑
        exit(1);
    }
    // 解析完成后直接使用kernel数组做图像处理即可
    return 0;
}

注意事项

  1. strtok()会修改输入的原字符串,若需要保留原始kArg内容,请先调用strdup()或手动拷贝一份副本再用于解析
  2. 示例采用行优先规则存储3x3数组,输入的第1个值对应kernel[0][0]、第2个对应kernel[0][1],以此类推,若需要列优先存储只需修改数组赋值的索引规则即可

内容的提问来源于stack exchange,提问作者Lost_Delegate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 18:15:01