我是个菜鸟,下面的代码有问题:

#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/

10-12 06:59