gpt4 book ai didi

c - 如何使用lfind

转载 作者:行者123 更新时间:2023-12-01 22:54:55 24 4
gpt4 key购买 nike

我将 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,该函数仍然有效。

谁能给我解释一下这两个奇怪的地方吗?

最佳答案

&bufferbuffer 将具有相同的值。数组的名称充当指向其第一个元素的指针,这就是为什么您会得到相同的值。

现在,如果我们谈论你的第二个问题(char(*)[]) 相当于(char**)?

(char(*)[]) 不是函数指针。它是指向字符数组的指针。数组和指针不一样。数组可能会像指针一样衰减。

请看一下here

关于c - 如何使用lfind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18081668/

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