memcmp与数组数组

时间:2012-09-19 06:43:54

标签: c strcmp memcmp

在C中,我想检查给定的字符数组是否有任意字母,并根据它的含义进行更改。例如,字符“a”或“A”将变为“4”(表示4的字符)。这是我的编码练习:)

代码如下:

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <zlib.h>

#define NUM_BUFFERS 8
#define BUFFER_LENGTH 1024

char buffArrays[NUM_BUFFERS][BUFFER_LENGTH];

int main(int argc, const char* arg[v])
{
    const char a[] = "a";

    gzFile file;
    file = gzopen("a.txt", "rb"); //contains 8 lines of 1024 'a's
    int counter = 0;
    while(counter < NUM_BUFFERS)
    {
        gzread(file, buffArrays[counter], BUFFER_LENGTH - 1);
        counter++;
    }
    counter = 0;
    while(counter < NUM_BUFFERS)
    {
        int i = 0;
        for( i; i < BUFFER_LENGTH; i++ )
        {
            int *changed = &buffArrays[counter][i];
            if( memcmp(&a, changed, 1) == 0 )
                printf("SUCCESS\n");
        }
        counter++;
    }
    gzclose(file);
    return 0;
}

此代码永远不会到达“SUCCESS”部分。这跟我说要么

(1)更改的值并未指向正确的事物 (2)指针&amp; a不正确 (3)我完全错了,这是别的什么

任何帮助都将不胜感激。

4 个答案:

答案 0 :(得分:1)

声明

bufferArrays[counter] = "a";

不合法。它指定一个指向单个char的指针,并且应该给出编译器错误(或者至少是一个警告)。而是尝试

bufferArrays[counter] = 'a';

此外,在while循环(两者都是)中,您不会增加counter,因此会一遍又一遍地遍历相同的索引。

修改:其他问题

您进行比较的条件也存在缺陷:

memcmp(&a, changed, 4)

上面没有比较指针,它比较指针指向的内容,并且比较四个字节,而内容只是一个字节。此外,您无法比较指针,因为它们不同;变量a的内容存储在与bufferArrays[counter][i]内容不同的位置。

答案 1 :(得分:1)

此:

bufferArrays[counter] = "a"; //all the buffers contain one "a"

是错误的,因为bufferArrays[counter]不是字符指针而是字符数组。你需要:

strcpy(bufferArrays[counter], "a");

此外,您没有显示readTOmodify,因此该部分有点难以理解。

此外,字符串最好与strcpy()进行比较,后者逐个字符地进行比较,并在终止'\0'处停止。您使用memcmp(),我不明白4的原因,即您要比较的字节数。

答案 2 :(得分:1)

1)bufferArrays [counter] =“a”; //所有缓冲区都包含一个“a”

这不行,您必须使用strcpy复制字符串:

strcpy(bufferArrays[counter],"a"); //all the buffers contain one "a"

2)

#define BUFFER_LENGTH 1

这是一个问题。如果您只想存储一个char(用于额外的空终止),则缓冲区长度应至少为2。

3)在你的两个循环中,你永远不会改变counter,这会导致无限循环。

你的代码在哪里?我没有看到它周围的任何功能。

修改 要分配你也可以使用:

while(counter < NUM_BUFFERS)
{
    bufferArrays[counter][0] = 'a'; //all the buffers contain one "a"
    counter++;
}

在任何情况下,如果要将其用作C字符串,则必须将缓冲区长度设置为2.

答案 3 :(得分:1)

两件事。

以下内容将值0x61'a'分配给字符串。

const char a[] = 'a';

你可能更愿意写

const char a = 'a'; /* assign a character to a character */

const char a[] = "a"; /* assign a string to a string */

接下来的事情是以下声明。在此,您指定一个指向int的指针,其内存地址为char。当您在下一个语句中读取有效内存的边界时,会调用未定义的行为。

int *changed = &bufferArrays[counter][i]; 

在此您比较从两个地址开始的前四个字节。两个变量只有一个字节宽。

if( memcmp(&a, changed, 4) == 0 )

如果您只想知道某些缓冲区中是否有'a',为什么不呢。

int i, j;
for (i = 0; i < NUM_BUFFERS; i++)
  for (j = 0; j < BUFFER_LENGTH; j++)
    if (bufferArrays[i][j] == 'a') printf("got it!\n");