此功能位于套接字服务器中。当客户端发送查询时,服务器接受查询并从链接列表中查找匹配项。该函数适用于前几个查询,然后发生分段错误。问题出现在sprintf调用("在sprintf之前。\ n"之后)。我真的不明白为什么它只能工作几次。我做错了什么?
char* searchNode(char* query) {
int i, isFound, count = 0;
node* temp = head;
char* searchResult = calloc(1, sizeof(* searchResult));
char* finalResult = calloc(1, sizeof(* finalResult));;
printf("Before search node.\n");
while(temp->next) {
isFound = TRUE;
temp = temp->next;
for(i = 0; i < strlen(query); i++) { /* compare each char in both strings */
if(tolower(query[i]) != tolower(temp->foodName[i])) {
isFound = FALSE;
break;
}
}
if(isFound == TRUE) { /* if a match is found, write it into the temp string */
printf("Match found.\n");
searchResult = realloc(searchResult, strlen(searchResult) + 1 + strlen(nodeToString(temp)) + 1);
printf("Before sprintf.\n");
sprintf(searchResult, "%s%s", searchResult, nodeToString(temp));
count++; /* count the number of results found */
}
}
printf("Before finalise string.\n");
if(count > 0) { /* if at least a result is found, add combine all results with a head line*/
sprintf(finalResult, "%d food item(s) found.\n\n", count);
strcat(finalResult, searchResult);
free(searchResult);
return finalResult;
}
/* if no match is found, return this message */
return "No food item found.\nPlease check your spelling and try again.\n";
}
答案 0 :(得分:1)
你忘了测试calloc
的成功。并且您正在错误地使用它:您需要为其中的0终止字符串分配足够的字节。
请注意 是非常错误的:它等同于char* searchResult = calloc(1, sizeof(* searchResult));
/* wrong code*/ char* searchResult= calloc(1,1);
,你不能这样做(你需要分配足够宽的字符串);你有一些undefined behavior并且运气不好而且它没有崩溃(SO包含关于UB的许多答案,参见例如this one)。
您应该使用snprintf(3)(可能使用strdup(3))并且您应该考虑终止零字节的snprintf
+ 1的结果。如果系统提供,您可能需要使用asprintf(3)。
请编译所有警告和调试信息gcc -Wall -Wextra -g
。使用valgrind和gdb
调试程序。
答案 1 :(得分:1)
在将searchResult作为参数传递时,我不知道sprintf会做什么。我系统上的手册页表明它未定义:
C99和POSIX.1-2001指定在调用时结果未定义 到sprintf(),snprintf(),vsprintf()或vsnprintf()会导致复制 在重叠的对象之间发生(例如,如果目标 字符串数组和提供的输入参数之一引用相同 缓冲液)。
你可能应该在那里使用strcat。
答案 2 :(得分:1)
只是阅读失败的行
sprintf(searchResult, "%s%s", searchResult, nodeToString(temp));
它将searchResult和其他内容打印到searchResult中。它无法工作
searchResult不是Tardis
答案 3 :(得分:0)
您 调整searchResult
指向的内容,但finalResult
仅指向1 char
,尽管最终会将所有搜索结果复制到其中,最可能的是1 char
,其中写入了无效的记忆并引发了未定义的行为。