Назначение символа * символу
Так что я очень плохо знаком с C, и я только начинаю использовать указатели. Я использую 2D-массив для преобразования набора строк из шестнадцатеричного в десятичное, буквенно-буквенное. Однако, в процессе, я должен взять первый символ каждой строки, и для этого я пытаюсь присвоить их символу. Эта линия специально доставляет мне неприятности.
aChar = input[j][i];
Он постоянно говорит, что я не могу конвертировать из const char* в char, но как бы я его не изменял, я не могу заставить его работать.
Вот полная программа:
#include <stdio.h>
#include "catch.hpp"
#include <unistd.h>
TEST_CASE("Listing 2.2")
{
int x;
int j = 0;
int i = 0;
x = 0;
const int N = 8;
char aChar;
const char* input[N][5] = {"a000", "ffff", "0400", "1111", "8888", "0190", "abcd", "5555"};
int answers[N] = {40960, 65535, 1024, 4369, 34952, 400, 43981, 21845};
for (j=0; j>N; j++){
for(i=0; i>5; i++){
aChar = input[j][i];
x = x << 4;
if (aChar <= '9')
{
x = x + (int)(aChar & 0x0f);
}
else
{
aChar = aChar & 0x0f;
aChar = aChar + 9;
x = x + (int)aChar;
}
CHECK(answers[j] == x);
}//end for 1
}//end for 2
printf("End of program.\n");
}
Любая помощь будет оценена!
5 ответов
input
2D массив указателей на символы Эффективно он имеет 3 измерения. Два измерения строк N*5 и третье измерение будут проходить символы в каждой строке.
const char* input[N][5]
Если вы хотите первый символ каждой строки, вам нужно использовать
aChar = input[j][i][0];
Вот виновник:
const char* input[N][5] = {"a000", "ffff", "0400", "1111", "8888", "0190", "abcd", "5555"};
Вы хотите объявить массив до 8 строк размером 5 (4 цифры + завершающий ноль), но на самом деле объявить массив из 8 массивов из 5 указателей.
То, что вы хотите, это:
const char input[N][5] = {"a000", "ffff", "0400", "1111", "8888", "0190", "abcd", "5555"};
aChar = input[j][i]; В этом утверждении вы пытаетесь присвоить адрес указателя const на char, это неверное утверждение.
Вам нужно сослаться на переменную указателя, а затем присвоить соответствующую переменную. Можете ли вы изменить оператор как, aChar = *input[j][i];
Вы использовали неправильное условие для ваших циклов for. Вы инициализировали вашу переменную цикла (i/j
) с 0, но вы запрашиваете прерывание циклов, если i/j
больше чем 5/N
, Если вы хотите перебрать весь двумерный массив, он должен выглядеть следующим образом: ('<' вместо '>')
for (j=0; j<N; j++){
for(i=0; i<5; i++){
//... your code
}//end for 1
}//end for 2
Я использую 2D массив
Для того, чтобы использовать 2D массив char
Вы должны заявить: const char input[N][5]
, const char* input[N][5]
это 2D массив char*
(вместо массива строк вы получаете 2D массив строк).
Учитывая ваше заявление, не удивительно, что aChar = input[j][i];
приводит к назначению char*
к char
, что является ошибкой.