0

Cでは、指定されたcharの配列で任意の文字をチェックし、それが何であるかに応じて変更したいと思います。たとえば、文字「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)ポインタ&aが間違っている(3)私は完全に間違っており、それは別のものです

どんな助けでもいただければ幸いです。

4

4 に答える 4

1

ステートメント

bufferArrays[counter] = "a";

合法ではありません。シングルにポインタを割り当て、charコンパイラエラー(または少なくとも警告)を出す必要があります。代わりに試してください

bufferArrays[counter] = 'a';

また、whileループ(両方)では増加しないcounterため、同じインデックスを何度も何度もループします。

編集:さらなる問題

比較を行う条件にも欠陥があります。

memcmp(&a, changed, 4)

上記はポインタを比較するのではなく、ポインタが指すものの内容を比較し、内容が1バイトだけである間に4バイトを比較します。また、ポインタが異なるため、ポインタを比較することはできませ。変数の内容は、の内容とはa異なる場所に格納されbufferArrays[counter][i]ます。

于 2012-09-19T06:48:02.350 に答える
1

これ:

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

bufferArrays[counter]は文字ポインタではなく文字配列であるため、間違っています。必要なもの:

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

また、表示しないreadTOmodifyので、その部分が少しわかりにくいです。

さらに、文字列は、文字ごとstrcpy()に比較し、終了点で停止する、と最もよく比較されます'\0'。あなたはを使用します、そして私はあなたが比較しているバイト数であるmemcmp()理由を理解していません。4

于 2012-09-19T06:48:29.820 に答える
1

1)bufferArrays [counter] = "a"; //すべてのバッファに1つの「a」が含まれています

これは問題ありませんstrcpy。文字列をコピー するために使用する必要があります。

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

2)

#define BUFFER_LENGTH 1

ここに問題があります。1文字だけを格納する場合(追加のヌル終了用)、バッファー長は少なくとも2にする必要があります。

3)両方のループで、を変更することはありませんcounter。これにより、無限ループが発生します。

あなたのコードはどこにありますか?それを取り巻く機能は見当たりません。

編集: 割り当てるには、次を使用することもできます:

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

いずれの場合も、C文字列として使用する場合は、バッファ長を2にする必要があります。

于 2012-09-19T06:50:42.300 に答える
1

2つのこと。

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]; 

これにより、両方のアドレスから始まる最初の4バイトを比較します。両方の変数の幅は1バイトのみです。

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");
于 2012-09-19T07:18:23.293 に答える