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

Этот код никогда не достигает части "УСПЕХ". Это говорит мне, что либо

(1) значение change не указывает на правильную вещь (2) указатель &a неверен (3) я совершенно не прав, и это нечто другое

Любая помощь будет оценена.

4 ответа

Решение

Две вещи.

Следующее присваивает значение 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 )

Если вы хотите узнать, есть ли в буфере символ "а", почему бы вам просто не сделать это?

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

Заявление

bufferArrays[counter] = "a";

не законно Он назначает указатель на один char и должен выдать ошибку компилятора (или хотя бы предупреждение). Вместо этого попробуйте

bufferArrays[counter] = 'a';

Кроме того, в while петли (их обоих) ты не увеличиваешь counter и так зацикливаться на одном и том же индексе снова и снова навсегда.

Изменить: дальнейшие проблемы

Условие, в котором вы делаете сравнение, также некорректно:

memcmp(&a, changed, 4)

Вышеприведенное не сравнивает указатели, оно сравнивает содержимое того, на что указывают указатели, и вы сравниваете четыре байта, в то время как содержимое представляет собой только один байт. Кроме того, вы не можете сравнивать указатели, так как они будут разными; Содержание переменной a хранится в другом месте, чем содержимое содержимого bufferArrays[counter][i],

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-строки.

Это:

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

неправильно, так как bufferArrays[counter] это не символьный указатель, а символьный массив. Тебе нужно:

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

Кроме того, вы не показываете readTOmodify, так что эту часть немного сложно понять.

Кроме того, строки лучше по сравнению с strcpy(), который сравнивает символ за символом и останавливается на конце '\0', Ты используешь memcmp()и я не понимаю причину 4 это количество байтов, которые вы сравниваете.

Другие вопросы по тегам