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
это количество байтов, которые вы сравниваете.