gpt4 book ai didi

如果我尝试打印值,则 C strtok 工作,但如果我尝试传递值,则出现段错误和 null

转载 作者:行者123 更新时间:2023-11-30 20:22:20 24 4
gpt4 key购买 nike

void read_entries() {
int count = 0;
for (int i = 0; i < top; i++) {
FILE *fp;
fp = fopen(File_List[i], "r");
char buff[1024];

while (fgets(buff, 1024, fp) != NULL) {
if (good_data(buff)) {
count++;
}

}

fclose(fp);
}
}


int good_data(char* buff) {
char *ip;
ip = strtok (buff, " ");
ip = strtok (NULL, " ");
ip = strtok (NULL, " ");
ip = strtok (ip, ":");

printf("IP below\n");
printf("%s\n", ip);
//strcmp(ip, "69.12.26.238");
return 0;
}

我有一个函数可以解析一行并从中获取 IP。当我执行以下操作时,它会完全按照我的预期打印。但是,如果我尝试将该 ip 传递给函数,则会出现段错误。即使在我的 printf 行下面有一个函数也会导致 printf 为 ip 值打印 null 。这怎么可能?我该怎么做才能使用 ip 值?

最佳答案

strtok 返回一个必须立即使用或复制的缓冲区,该缓冲区绑定(bind)到第一个初始化缓冲区。

通过在返回它/将其传递给函数之前制作这样的副本来修复它(顺便说一句,我添加了更多语法检查):

  char *ip,*ip_copy;
ip = strtok (buff, " ");
ip = strtok (NULL, " ");
if (ip == NULL) return -1;
ip = strtok (NULL, " ");
if (ip == NULL) return -1;
ip = strtok (ip, ":");
if (ip == NULL) return -1;

ip_copy = strdup(ip); // now you have a solid copy of the string, that has a global scope.

注意:由于 strtok 的工作方式令人惊讶(不可重入,具有内存效应),因此存在很多类似的错误。

关于如果我尝试打印值,则 C strtok 工作,但如果我尝试传递值,则出现段错误和 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39822027/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com