我是个菜鸟,下面的代码有问题:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
void split_string(char *conf, char *host_ip[]){
long unsigned int conf_len = sizeof(conf);
char line[50];
strcpy(line, conf);
int i = 0;
char* token;
char* rest = line;
while ((token = strtok_r(rest, "_", &rest))){
host_ip[i] = token;
printf("-----------\n");
printf("token: %s\n", token);
i=i+1;
}
}
int main(){
char *my_conf[1];
my_conf[0] = "conf01_192.168.10.1";
char *host_ip[2];
split_string(my_conf[0], host_ip);
printf("%s\n",host_ip[0]);
printf("%s\n",host_ip[1]);
}
我想修改split_string函数中的主机ip数组,然后在main中打印得到的2个字符串。
但是,最后两个printf()只打印未知/随机字符(可能是地址?)有什么帮助吗?
最佳答案
有两个问题:
首先,返回指向局部变量的指针。您可以通过strdup
字符串和释放调用者来避免这种情况。
第二:
在第一次调用strtok_r()
时,str
应该指向要解析的字符串,并且忽略saveptr
的值。在随后的调用中,str
应该是NULL
,并且saveptr
应该与前一个调用保持不变。
也就是说,you must NULL
for the first argument after the first iteration in the loop.没有一个地方说可以对两个参数使用相同的指针。
这是因为strtok_r
几乎是脑死亡strtok
的替代品,只需要一个额外的参数,所以您甚至可以用宏包装它。。。
所以我们得到
char *start = rest;
while ((token = strtok_r(start, "_", &rest))){
host_ip[i] = strdup(token);
printf("-----------\n");
printf("token: %s\n", token);
i++;
start = NULL;
}
打电话的人:
free(host_ip[0]);
free(host_ip[1]);
关于c - 修改函数中的数组后输出错误(在C中),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58042069/