C语言解析含换行与逗号分隔的字符串问题求助
解决strtok解析多行逗号分隔字符串仅输出第一行的问题
问题说明
需要解析一个包含多行的字符串,每行内容用逗号分隔,期望逐个打印所有元素,但现有代码仅输出第一行的内容。
问题原因
strtok是非可重入函数,它内部通过静态变量记录上一次解析的位置。当处理完第一行的逗号分割后,调用strtok(NULL, "\n")时,函数会从第一行的末尾位置继续查找换行符,而非回到原始的字符串缓冲区,因此无法找到下一行,导致循环提前结束。
修复方案
方案1:使用可重入版本strtok_r
strtok_r允许手动维护解析上下文,不同解析流的上下文相互独立,不会互相干扰:
#include <stdio.h> #include <string.h> int main() { char cadena[] = "10,Arbol,3.5\n20,Perro,4.0\n30,Mesa,4.5"; char cadena_copy[sizeof(cadena)]; strcpy(cadena_copy, cadena); char *save_ptr_line; char *linea = strtok_r(cadena_copy, "\n", &save_ptr_line); while (linea != NULL) { char *save_ptr_token; char *token = strtok_r(linea, ",", &save_ptr_token); while (token != NULL) { printf("%s\n", token); token = strtok_r(NULL, ",", &save_ptr_token); } linea = strtok_r(NULL, "\n", &save_ptr_line); } return 0; }
方案2:复制行到临时缓冲区处理
每次获取一行后,将其复制到独立的临时缓冲区,再对临时缓冲区进行逗号分割,避免干扰原字符串的解析上下文:
#include <stdio.h> #include <string.h> int main() { char cadena[] = "10,Arbol,3.5\n20,Perro,4.0\n30,Mesa,4.5"; char cadena_copy[sizeof(cadena)]; strcpy(cadena_copy, cadena); char *linea = strtok(cadena_copy, "\n"); while (linea != NULL) { // 临时缓冲区大小可根据实际行长度调整 char temp_line[100]; strcpy(temp_line, linea); char *token = strtok(temp_line, ","); while (token != NULL) { printf("%s\n", token); token = strtok(NULL, ","); } linea = strtok(NULL, "\n"); } return 0; }
两种方案都能得到预期的输出:
10 Arbol 3.5 20 Perro 4.0 30 Mesa 4.5
内容的提问来源于stack exchange,提问作者Pedro Castro
相关产品推荐
相关产品推荐

