2012-09-19 68 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讀入,但我不想對此進行任何評論,但看起來我剛剛引起了混淆。 –