【问题标题】:How to strtok in C twice? [duplicate]如何在C中两次strtok? [复制]
【发布时间】:2020-10-23 19:39:38
【问题描述】:

我正在尝试解析空格,然后为项目解析逗号,数据与此类似:

37,4 23,4,9,6 22,11 99,29

我想先用空格分隔它们,然后用逗号分隔以获得单独的数字。 但这不起作用。

char *token = strtok(singleLine, " ");

while( token != NULL ) {
    token = strtok(NULL, " ");
    char *token2 = strtok(token, ",");
    while(*token2 != NULL){
        printf("%s", token)
        token2 = strtok(NULL,",");
    }
}

【问题讨论】:

  • 你如何声明singleLine?
  • 您发布的代码中有两个编译错误。
  • fgets(singleLine, 5000, inputPointer); singleLine 是我从文件中得到的东西。它只是我在描述中输入的数据
  • while(*token2 != NULL) { printf("%s", token) ... ==> while(token2 != NULL) { printf("%s ", token2) ...(三处更正)。

标签: c pointers


【解决方案1】:

strtok 函数使用内部静态变量来跟踪其状态,因此如果您尝试交错处理两个不同的字符串/子字符串,内部状态就会损坏。

如果您的系统支持,您应该改用strtok_r(或Windows 上的strok_s)此函数需要一个额外的参数来跟踪其当前状态。

char *state_inner, *state_outer;
char *token = strtok_r(singleLine, " ", &state_outer);

while (token != NULL ) {
    token = strtok_r(NULL, " ", &state_outer);
    char *token2 = strtok_r(token, ",", &state_inner);
    while (token2 != NULL){
        printf("%s", token);
        token2 = strtok_r(NULL,",", &state_inner);
    }
}

【讨论】:

  • 我必须在一些学校 zeus VPN 上编译和运行该项目。我会检查我是否可以使用 strtok_r,当我在本地使用时,它会给我隐式函数声明错误。
  • @Vehbi strtok_r 应该可以在 Linux 上使用。如果您使用的是 MSVC(即 Windows),则等效函数为 strtok_s。
【解决方案2】:

你不能像那样“嵌套”对strtok的调用——你将把字符串"37,4 23,4,9,6 22,11 99,29"拆分成序列"37,4"、"23,4,9,6"、"22,11"、"99,29" 然后拆分每个令牌以获得单独的数字。

【讨论】:

    猜你喜欢
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 2011-05-31
    • 1970-01-01
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多