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值?
答案 0 :(得分:1)
strtok
返回一个必须立即使用或复制的缓冲区,该缓冲区绑定到第一个初始化缓冲区。
通过在返回它之前制作这样的副本/将其传递给函数来修复它(我添加了更多语法检查BTW):
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
工作原理(不具有可重入性,具有记忆效应),因此存在许多类似的错误。