Назначение символа * символу

Так что я очень плохо знаком с 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, что является ошибкой.

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