我使用lfind
此代码:
int StringPtrCompare(const void *ptr1, const void *ptr2)
{
return strcmp(*(char(*)[])ptr1, *(char**)ptr2);
}
void Unique()
{
char* array[1000] = {0};
char buffer[200] = {0};
size_t count = 0;
FILE* fp = fopen("text", "r");
if (fp == NULL)
{
error(1, 0, "Couldn't open text for reading");
}
while (count < 1000 && fscanf(fp, "%199s", buffer) == 1)
{
if (!lfind(buffer, array, &count, sizeof(char*), StringPtrCompare))
{
array[count++] = strdup(buffer);
}
}
fclose(fp);
for (int i = 0; i < count; i++)
{
printf("%s\n", array[i]);
free(array[i]);
}
}
这行得通,但最初,我遇到了分段错误,如果相反,在 中StrPtrCompare
,我将第一个参数的转换替换strcmp
为
*(char**)ptr1
从概念上讲,我不明白为什么会这样。不是吗
(char(*)[]) equivalent to (char**)?
另外,我发现如果我在 while 循环语句中替换为,该函数仍然有效buffer
。&buffer
谁能给我解释一下这两个奇怪的地方?