2012-09-19 89 views
0

在C中,我想检查一个字符的给定数组的任意字母,并根据它是什么来改变它。例如,字符“a”或“A”将被改变为“4”(代表4的字符)。这是一个锻炼; Tibial编码对我来说:)memcmp与数组阵列

的代码如下:

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

此代码永远不会达到“成功”的一部分。这对我说,要么

(1)的改值没有指向正确的事 (2)指针&一个是不正确 (3)我完全错了,这是别的东西

任何帮助,将不胜感激。

+0

我希望我可以点击所有你们的答案。 –

回答

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"); 
+0

所以它应该是'char * changed =&bufferArrays [counter] [i];'? –

+0

也'if(memcmp(&a,changed,1)== 0)'?例如, –

+0

@SamP是。 – moooeeeep

1

声明

bufferArrays[counter] = "a"; 

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

bufferArrays[counter] = 'a'; 

此外,在 while环路(双方)你不一遍又一遍永远增加 counter等环比同一指标。

编辑:进一步的问题

,你做的比较是有缺陷以及条件:

memcmp(&a, changed, 4) 

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

+0

我编辑了我的代码,使其更清晰。这不是我的代码逐字 –

+0

@SamP那么忽略关于循环的部分,但我的第一部分仍然有效。 –

+0

我改变了它。我的记忆是否正确? –

1

此:

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

是错误的,因为bufferArrays[counter]不是字符指针,但一个字符阵列。您需要:

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

而且,你不显示readTOmodify,所以这部分很有点难以理解。

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

+0

我不确定需要比较多少个字节才能检查POSIX标准字符。我为了以防万一。检查新的编辑 –

+0

此外,我正在寻找评论,而不是我的指点。这是不是我的代码逐字,甚至没有缓冲区的长度是相同的。 –

1

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

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

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

2)

#define BUFFER_LENGTH 1 

这里有一个问题。如果要存储一个字符(用于额外的空终止),缓冲区长度应该至少为2。

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

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

编辑: 要指派你也可以使用:

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

在任何情况下,你必须有缓冲区长度为2,如果你想使用它作为一个C-字符串。

+0

更改功能。这不是我的代码,但只是一个片段。 –

+0

@SamP仍然存在'BUFFER_LENGTH'和'strcpy'问题。 –

+0

我可以使用bufferArrays [counter] ='a'; ?在我的真实代码中,它正在通过libz库中的gzread读入,但我不想对此进行任何评论,但看起来我刚刚引起了混淆。 –