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; }
注意事项
strtok()会修改输入的原字符串,若需要保留原始kArg内容,请先调用strdup()或手动拷贝一份副本再用于解析- 示例采用行优先规则存储3x3数组,输入的第1个值对应
kernel[0][0]、第2个对应kernel[0][1],以此类推,若需要列优先存储只需修改数组赋值的索引规则即可
内容的提问来源于stack exchange,提问作者Lost_Delegate
相关产品推荐
相关产品推荐

