преобразование двоичного в несколько символов - PullRequest
0 голосов
/ 06 октября 2019

Я вчера в основном разместил этот вопрос, но у меня другой тип ошибки. Поэтому я пытаюсь создать программу, в которой пользователь вводит 12-битную последовательность двоичного кода Хемминга, например «100010010001», и она должна распечатать соответствующий символ ASCII, который в данном случае равен «A».

Проблема, кажется, работает для отдельных символов, таких как «A», но если я наберу двоичную последовательность 100010010001010110010010010010000011, которая представляет «ABC», она выводит случайные символы, не связанные с тем, что должно быть напечатано. Я не понимаю, что является причиной этой проблемы?

char charToBin(char usersInput[]) {
    char j = 0 ;

    for (int i = 0; i <= 12 ; i++) {
        if((i == 0) || (i == 1) || (i == 3) || (i == 7)){
                continue ;
        } ;
        usersInput[j] = usersInput[i] ;
        j++ ;
    } ;
    char c = strtol(usersInput, (char **)NULL, 2);
    return c;
}

Ответы [ 3 ]

0 голосов
/ 06 октября 2019

Ваш цикл for () должен повторяться только 12 раз, следовательно, условие должно быть i <12 и создать локальный массив символов, как я это сделал (to_Char []) длины 9 (8 + 1 для Null в конце) исчитайте соответствующие биты в него из usersInput [], usersInput [] не следует предоставлять в качестве входных данных для strtol (), поскольку он имеет длину 32 бита, но длина наших символов составляет всего 8 бит. </p>

char charToBin(char usersInput[]) {
char j = 0;
char to_Char[9];

for (int i = 0; i < 12; i++) {
    if ((i == 0) || (i == 1) || (i == 3) || (i == 7)) {
        continue;
    };
    to_Char[j] = usersInput[i];
    j++;
};
to_Char[j] = '\0';

char c = strtol(to_Char, (char**)NULL, 2);
return c;
}
0 голосов
/ 06 октября 2019

Вы должны попробовать мой ответ на этот вопрос вчерашнего дня. Это решение будет работать, и первый метод должен быть очень быстрым, если вы пытаетесь разбить массив на шаги, потому что это небольшой массив.

Тем не менее, для этого кода основная проблема, с которой вы столкнулись в своем кодеявляется то, что вы пытаетесь удалить 4 индекса из массива char из 12 индексов, не делая ничего, чтобы сказать strtol (), что. Таким образом, в вашем коде вам нужно только указать strtol () остановиться на индексе 8, введя char '\ 0' в позицию 8 или массив, который будет 9-м символом. Кроме того, поскольку вы собираетесь пропустить индексы 0 и 1, нет смысла начинать с индекса 0 и оценивать, является ли он индексом 0 или 1. Вы можете начать с индекса 2. Кроме того, «i» должно быть меньше 12в вашей петле. Это потому, что последний индекс массива из 12 индексов будет 11, а не 12. Кроме того, j не обязательно должен быть символом. Это должно быть int.

char charToBin(char usersInput[]) {
    int j = 0 ;

    for (int i = 2; i < 12 ; i++) {
        if( (i == 3) || (i == 7) ){
                continue ;
        } ;
        usersInput[j] = usersInput[i] ;
        j++ ;
    } ;
    usersInput[8] = '\0';
    char c = strtol(usersInput, (char **)NULL, 2);
    return c;
}
0 голосов
/ 06 октября 2019

Вы должны предоставить больше информации о вашей программе, например, полностью функциональную main(), пример ввода и вывода, как вызывать функции и т. Д.

Но до этого я думаю, что такой код, как этот, может работать для вас.

p = len of usersInput  / 12
char * charToBin(char usersInput[], int p) {
    char j = 0 ;
    char *c;

    for(int n=0;n<p;n++){

        for (int i = 0; i <= 12 ; i++) {
        if((i == 0) || (i == 1) || (i == 3) || (i == 7)){
                continue ;
        } ;
        usersInput[j+n] = usersInput[i+n] ;
        j++ ;
    } ;

    c[n] = strtol(usersInput, (char **)NULL, 2);

}

    return c;

}
...