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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 12:12:44