不用strtok函数:先按空格再按=分割字符串并提取数值
手动实现按
=分割token并提取数值(无需strtok) 哈哈,这个需求很常见嘛!既然你已经搞定了不用strtok按空格分割字符串的部分,那针对每个token按=分割提取数值的逻辑其实是换汤不换药——核心就是手动遍历字符串定位分隔符,再截取目标内容。我给你理清楚步骤,再附上实用的C语言示例代码:
核心步骤
- 遍历每一个已经按空格分割好的token:不管你是用指针记录起始位置,还是用索引+长度存储token,先拿到单个token的完整内容。
- 在token内定位
=符号:从token的起始位置逐个字符遍历,直到找到=或者走到token末尾(一定要判断是否存在=,避免非法格式导致越界)。 - 提取
=后的数值内容:找到=后,它的下一个字符就是数值的起始点;如果=后面有多余空格,还可以加个逻辑跳过这些空白字符,确保拿到干净的数值。 - 处理边界情况:如果token里没有
=,或者=后面没有内容,记得跳过这类无效token,或者做错误提示。
示例代码(C语言)
假设你已经实现了空格分割token的逻辑,这里把完整流程整合起来:
#include <stdio.h> #include <string.h> #include <ctype.h> #define MAX_TOKENS 100 // 最大token数量,按需调整 #define MAX_VALUE_LEN 100 // 单个数值的最大长度,按需调整 int main() { char input[] = "width=800 height=600 fps=30 volume=75 invalid_token"; char *current_ptr = input; char *tokens[MAX_TOKENS]; int token_count = 0; char extracted_values[MAX_TOKENS][MAX_VALUE_LEN]; int value_count = 0; // -------------------------- // 第一步:按空格分割token(你已实现的部分,这里给个参考实现) // -------------------------- while (*current_ptr != '\0') { // 跳过token前的所有空白字符(空格、制表符等) while (isspace((unsigned char)*current_ptr)) { current_ptr++; } if (*current_ptr == '\0') break; // 提前结束,避免空token // 记录当前token的起始地址 tokens[token_count++] = current_ptr; // 走到当前token的末尾(下一个空白或字符串结束) while (*current_ptr != '\0' && !isspace((unsigned char)*current_ptr)) { current_ptr++; } // 如果不是字符串结尾,把空白字符改成'\0',分割出当前token if (*current_ptr != '\0') { *current_ptr = '\0'; current_ptr++; } } // -------------------------- // 第二步:对每个token按=分割,提取数值 // -------------------------- for (int i = 0; i < token_count; i++) { char *token = tokens[i]; char *equal_sign = token; // 在当前token里找=的位置 while (*equal_sign != '\0' && *equal_sign != '=') { equal_sign++; } // 检查是否找到有效=(存在=且后面有内容) if (*equal_sign == '=' && *(equal_sign + 1) != '\0') { char *value_start = equal_sign + 1; // 可选:跳过=后面的空白字符(比如处理"key= 123"这种情况) while (isspace((unsigned char)*value_start)) { value_start++; } // 把数值复制到新缓冲区,用strncpy避免溢出 strncpy(extracted_values[value_count], value_start, MAX_VALUE_LEN - 1); extracted_values[value_count][MAX_VALUE_LEN - 1] = '\0'; // 确保字符串结尾 value_count++; } else { // 处理无效token的情况,比如跳过或打印提示 printf("Skipping invalid token: %s\n", token); } } // 打印提取结果 printf("\nExtracted values:\n"); for (int i = 0; i < value_count; i++) { printf("- %s\n", extracted_values[i]); } return 0; }
关键细节说明
- 用
isspace而不是直接判断' ':可以处理所有空白字符(比如制表符\t),逻辑更鲁棒。 - 缓冲区大小要按需调整:
MAX_TOKENS和MAX_VALUE_LEN要根据你的实际输入规模设置,避免溢出。 - 可选的空白处理:如果你的场景中
=后面可能有空格,那跳过空白的逻辑很有用;如果确定没有,可以去掉这部分。 - 内存安全:用
strncpy代替strcpy,避免数值过长导致缓冲区溢出;同时手动添加字符串结束符'\0'。
内容的提问来源于stack exchange,提问作者user873101
相关产品推荐
相关产品推荐

