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

时间:2014-09-23 20:02:17

标签: c arrays string compare

我正在读取每行上有十六进制值的文件。它看起来像这样:

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);
}

3 个答案:

答案 0 :(得分:0)

我看不到strcmp / strcpy的问题,但是:

for(f=0; f<sizeof(data); f++)

你不能使用sizeof,即。它不会产生值count_line 从显示的代码中,这可能足以使其工作。

答案 1 :(得分:0)

只需与先前分配的行进行比较,即i行。

// for(f=0; f<sizeof(data); f++)
for(f=0; f<i; f++)

答案 2 :(得分:0)

考虑以下几点:

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

sizeof(data)的价值是多少?由于data类型为char**,因此大概是sizeof(data) i是指针的大小,以字节为单位,因此有一些固定的整数值,如4或8。 现在观察一下你第一次在“for i”循环中遇到这个循环, data[0]为0,data是已分配的指针数组中的唯一指针 - f中的每个其他指针都无效。 所以现在发生的是,我们做了内循环的第一次迭代:f是0,所以我们 最后将我们刚读到的字符串与自己进行比较。 在下一次迭代中,data[1]为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中) 仅包含已加载的字符串。

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