C语言如何从指定格式字符串中提取可变长度的整数与字符串
嘿,刚学C一周就上手写程序,这进度不错!从Python转过来确实会觉得C的字符串处理麻烦不少,毕竟Python有现成的split、正则这些工具,C就得靠标准库函数来搞定。我来给你拆解这两个场景的实现方法~
场景一:提取标识符和两个整数
这个场景的字符串格式很固定:标识符[数字1,数字2];,我们可以用C标准库的sscanf函数来直接匹配格式,一次性提取出需要的内容,比手动遍历字符串简单多了。
实现代码
#include <stdio.h> int main() { char str[50] = "dimension[1080,720];"; char identifier[20]; // 定义足够大的数组存标识符,根据实际需求调整大小 int num1, num2; // 用sscanf匹配格式:先读[之前的所有字符(标识符),再读括号里的两个整数 int match_count = sscanf(str, "%[^[]][%d,%d];", identifier, &num1, &num2); // 检查是否成功匹配3个目标(标识符、num1、num2) if (match_count == 3) { printf("标识符:%s\n第一个数字:%d\n第二个数字:%d\n", identifier, num1, num2); } else { printf("格式不匹配,提取失败!\n"); } return 0; }
关键格式说明
%[^[]]:这个格式符的意思是匹配所有不是'['的字符,所以会把dimension完整读出来,直到遇到第一个[为止。[%d,%d];:后面的部分用来匹配括号里的内容,%d会自动识别整数(不管位数多少),中间的逗号、前后的括号和分号都是固定分隔符,sscanf会自动跳过它们。
场景二:提取标识符、带引号的字符串和两个整数
这个场景多了一个带双引号的字符串,格式是标识符["字符串",数字1,数字2];,我们只需要调整sscanf的格式字符串,把引号里的内容匹配出来就行。
实现代码
#include <stdio.h> int main() { char str[50] = "dimension[\"string\",1080,720];"; char identifier[20]; char inner_str[20]; // 存引号里的字符串,注意调整数组大小适配实际内容 int num1, num2; // 格式字符串里用\"转义双引号,匹配引号内的内容 int match_count = sscanf(str, "%[^[]][\"%[^\"]\",%d,%d];", identifier, inner_str, &num1, &num2); // 这次要匹配4个目标,所以检查match_count是否为4 if (match_count == 4) { printf("标识符:%s\n内部字符串:%s\n第一个数字:%d\n第二个数字:%d\n", identifier, inner_str, num1, num2); } else { printf("格式不匹配,提取失败!\n"); } return 0; }
关键格式说明
\"%[^\"]\":这里的\"是转义后的双引号,sscanf会先匹配一个双引号,然后%[^\"]匹配所有不是双引号的字符(也就是string),最后再匹配后面的双引号,这样就能把引号里的内容干净地提取出来(不带引号)。
小提示
- 如果标识符或内部字符串可能很长,一定要调整数组的大小,避免缓冲区溢出(比如把
20改成更大的数值)。 - 如果输入字符串里可能有空格(比如
dimension[ "hello", 123, 456 ];),可以在格式字符串的分隔符前后加空格,比如"%[^[]] [ \"%[^\"]\" , %d , %d ];",这样sscanf会自动忽略空格。
内容的提问来源于stack exchange,提问作者JacopoBiondi
相关产品推荐
相关产品推荐

