下面的代码片段有什么问题;它在第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
调用它,在两种情况下都是要解析的字符串的第一个参数。它第二次解析失败。
有什么想法吗?
答案 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