gpt4 book ai didi

c - 如何在 C 中将特定字符串与数组的所有元素进行比较?

转载 作者:行者123 更新时间:2023-11-30 17:28:36 26 4
gpt4 key购买 nike

我正在从每行都有一个十六进制值的文件中读入。它看起来像这样:

F0BA3240C
083FA52
45D3687AF
etc.

十六进制值的长度不同。

我让 fgets 从此文件读取到缓冲区,然后使用一段代码来删除换行符。从那里我将缓冲区中的字符串放入我的数据数组中。但是在将缓冲区中的字符串放入数据数组之前,我尝试将缓冲区中的字符串与已存储在数据数组中的字符串进行比较,看看是否存在匹配,以便我可以更新一些计数器。但是,我在使用 strcmp 和 strncmp 时遇到问题。任何帮助将不胜感激,谢谢。

相关代码:

char **data = NULL;
char data_buffer[100];

//program first goes through the file and determines amount of lines there are hence this variable
int count_line = 0;
...
data = malloc(count_line * sizeof(char *));
int f;
int i;
for(i=0; i<count_line; i++)
{
fgets(data_buffer, sizeof(data_buffer), fp);

...

//allocate space to store copy of line and add one for null terminator
data[i] = malloc(line_length + 1);

...
if(asdf != NULL)
{
//problem here. don't know how to compare stream from buffer and compare to all elements of data buffer
for(f=0; f<sizeof(data); f++)
{
if(strcmp(data[f], data_buffer) == 0)
there_was_a_match++;
}

}
...
//copy string from buffer into data array
strcpy(data[i], data_buffer);
}

最佳答案

考虑这些行:

        for(f=0; f<sizeof(data); f++)
{
if(strcmp(data[f], data_buffer) == 0)
there_was_a_match++;
}

sizeof(data) 的值是多少?由于 data 的类型为 char**,大概sizeof(data) 是指针的大小(以字节为单位),因此是一些固定整数值,例如 4 或 8。现在观察一下,第一次在“for i”循环中遇到此循环时,i 为 0,data[0] 是已分配的指针数组中唯一的指针 -data 中的所有其他指针均无效。所以现在发生的是,我们进行内部循环的第一次迭代:f 是 0,所以我们最终将我们刚刚读取的字符串与其自身进行比较。在下一次迭代中,f 为 1,我们尝试将最新的字符串与 data[1] 进行比较,但 data[1] 尚未初始化,因此,我们有未定义的行为(例如崩溃)。

如果 f 循环如下所示,您的情况可能会更好:

        for(f=0; f<i; ++f)
{
if(strcmp(data[f], data_buffer) == 0)
there_was_a_match++;
}

这样,您将比较最新的字符串(您刚刚保存在 data[i] 中)仅包含已加载的字符串。

还有一件事可能会很麻烦。假设您的输入由四个组成相同字符串的副本。然后,在读取第二个副本并执行此循环后,there_was_a_match 将为 1;读取第三个副本并执行该循环后,there_was_a_match 将为 3(因为它匹配两次);读取第四个副本并执行该循环后,there_was_a_match 将为 6。我怀疑这些不是你想要的结果。也许您想在找到第一个匹配项后跳出循环。

关于c - 如何在 C 中将特定字符串与数组的所有元素进行比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26003766/

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