尽管适当的调用,strtok仍然失败

时间:2017-04-25 09:00:41

标签: c strtok

下面的代码片段有什么问题;它在第25行失败了。我不明白为什么会失败。

#include <stdio.h>
#include <string.h>

char linebuf[1024]="SET SLMSRVR 10.133.2.102:    50011";
char *tempStr;
char *str;

int main()
{
    tempStr = calloc(1024, sizeof(char));

    strcpy(tempStr, linebuf+strlen("SET SLMSRVR"));
    printf("1 tempStr: %s\r\n", tempStr);

    str = strtok(tempStr, ":");
    printf("2 tempStr: %s\tstr: %s\r\n", tempStr, str);

    if (str != NULL){
        printf("Server IP: %s\r\n",str);
    } else {
        printf("Error 1\r\n");
    }

    str = strtok(tempStr, NULL);
    printf("3 tempStr: %s\tstr: %s\r\n", tempStr, str);
    if (str != NULL) {
        printf("Port: %s\r\n", str);
   } 

    return 0;
}

这里作为strtok的规范建议,首先使用分隔符字符串然后使用NULL调用它,在两种情况下都是要解析的字符串的第一个参数。它第二次解析失败。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

第二次你应该把它称为str = strtok(NULL,“:”);

答案 1 :(得分:2)

我相信你弄错了。像

这样的电话
  str = strtok(tempStr, NULL);

没有意义,你将指针作为NULL传递给分隔符字符串。如果要继续解析与以前相同的字符串,则需要将第一个参数作为NULL传递。

引用C11,章节§7.24.5.8,(强调我的

char *strtok(char * restrict s1,
     

const char * restrict s2);

     

strtok()函数的一系列调用将s1指向的字符串分成一个   标记序列,每个标记由指向的字符串中的字符分隔   按s2序列中的第一个调用具有非null的第一个参数;随后的电话   sequence的第一个参数为null。 s2指向的分隔符字符串可能是   不同于打电话。

也许你想要的是

 str = strtok(NULL, ":");  //or some other delimiter