переводчик текста в код Морзе работает, но печатает (null)

Я понял, как я могу перевести ввод пользователя в азбуку Морзе. Оно работает. Единственное, что меня беспокоит, это то, что независимо от того, какой ввод я даю, в конце результата написано (null), и я не знаю, что мне нужно изменить в моем коде, чтобы избавиться от него. Я подумал, что это может быть конец массива, который нельзя перевести

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char* tableSetup();
char* all_Cap(char sentence[]);
char* trans_to_morse(char* morse[], int b);

int main()
{
    char* morse[1024];
    char sentence[256];


    fgets(sentence,256,stdin);
    all_Cap(sentence);

    int b=strlen(sentence);
    for(int i=0;i<b;i++){
            morse[i]=tableSetup(sentence[i]);
    }

    trans_to_morse(morse, b);

    return (0);
}

char* tableSetup(int i){
    char* table[256]={0};

    table['0']="-----";
    table['1']=".----";
    table['2']="..---";
    table['3']="...--";
    table['4']="....-";
    table['5']=".....";
    table['6']="-....";
    table['7']="--...";
    table['8']="---..";
    table['9']="----.";
    table['A']=".-";
    table['B']="-...";
    table['C']="-.-.";
    table['D']="-..";
    table['E']=".";
    table['F']="..-.";
    table['G']="--.";
    table['H']="....";
    table['I']="..";
    table['J']=".---";
    table['K']="-.-";
    table['L']=".-..";
    table['M']="--";
    table['N']="-.";
    table['O']="---";
    table['P']=".--.";
    table['Q']="--.-";
    table['R']=".-.";
    table['S']="...";
    table['T']="-";
    table['U']="..-";
    table['V']="...-";
    table['W']=".--";
    table['X']="-..-";
    table['Y']="-.--";
    table['Z']="--..";
    table['.']=".-.-.-";
    table[',']="--..--";
    table[':']="---...";
    table[';']="-.-.-.";
    table['?']="..--..";
    table['!']="-.-.--";
    table['-']="-....-";
    table['_']="..--.-";
    table['(']="-.--.";
    table[')']="-.--.-";
    table['"']=".-..-.";
    table['=']="-...-";
    table['+']=".-.-.";
    table['/']="-..-.";
    table['@']=".--.-.";
    table[' ']=".......";


    return(table[i]);
}

char* all_Cap(char sentence[]){
    int b=strlen(sentence);
    for(int i=0;i<b;i++){
        if(sentence[i]>=97 && sentence[i]<=122) sentence[i] -=32;
    }
    return(sentence);
}

char* trans_to_morse(char* morse[], int b){
    for(int i=0;i<b;i++){
        printf("%s ",morse[i]);
    }
    return(0);
}

Исход:

How are you?
.... --- .-- ....... .- .-. . ....... -.-- --- ..- ..--.. (null)
Process returned 0 (0x0)   execution time : 6.915 s
Press any key to continue.
# text null morse-code
Источник
  • 4
    man fgets : «Если читается новая строка, она сохраняется в буфере». Предлагаю вам выполнить базовую отладку. Запустите свою программу в отладчике, проверьте значение последнего символа и выполните код по мере обработки этого последнего символа.
  • 2
    Вы можете проверить, не является ли morse[i] ненулевым перед его if (morse[i]) printf("%s ", morse[i]); .
  • 0
    Спасибо, @IanAbbott, это помогло: D
  • 2
    Любопытно, хорошее использование 'A' в table['A']=".-"; , но затем код возвращается к 97 в if(sentence[i]>=97 && sentence[i]<=122) sentence[i] -=32; . Возможно, if(sentence[i]>='a' && sentence[i]<='z') sentence[i] -= 'a' - 'A'; или еще лучше tolower() .
  • 3
    tableSetup таблицу каждый раз при запуске функции tableSetup? Это крайне неэффективно. Просто создайте свою таблицу как глобальную const char *table[] = ...
  • 3
    В сторону: Ошибка: tableSetup(sentence[i]) является проблемой, когда sentence[i] < 0 . Предложите char* tableSetup(int i) -> char* tableSetup(unsigned char i) чтобы избежать отрицательных индексов.
  • 0
    @MarcoBonelli мой учитель говорит мне избегать чего-либо глобального, чтобы научиться передавать переменные другим функциям
  • 4
    Ваш учитель прав в общем случае, но это действительно ясное и стандартное исключение из этого глупого правила. Глобальные переменные не являются злом, если они используются правильно и по мере необходимости. Было бы бессмысленно иметь n global, например, но для таблицы, которая используется снова и снова, это просто очевидный способ (и это также намного быстрее).
  • 0
    @WladislawKusnezow этот массив никогда не меняется, если вы не хотите, чтобы он был глобальным, объявляйте его static в tableSetup , также он не содержит char* но const char*
  • 0
    используя char* table[256] вы предполагаете, что код символа составляет от 0 до 255, из-за того, что символ может быть подписан, как сигнализируется @ chux-ReinstateMonica, вы не можете предположить, что даже управляя unsigned char , используйте UCHAR_MAX+1 или SCHAR_MAX-SCHAR_MIN+1
  • 1
    if(sentence[i]>=97 && sentence[i]<=122) sentence[i] -=32; ? Вы имели в виду sentence[i] = toupper(sentence[i]; ;?
  • 0
    @AndrewHenle, так что в основном да, я новичок в кодировании и свой путь if(sentence[i]>=97 && sentence[i]<=122) sentence[i] -=32; был самый простой способ, который я имел в виду. Спасибо за совет, воспользуюсь этим вместо моего: D
Codelisting
за 1 против
Лучший ответ

Просто включите строку инициализации, в которой говорится

table[`\n`] = "";

Проблема в том, чтоfgets(3) включает заключительный\n символ, поэтому вы пытаетесь его распечатать, а запись в таблице для\n характерNULL как вы указали в объявлении.

Другое решение - отобразитьtable['\n'] = "\n"; поэтому новая строка отображается в строку с помощью только\n , и вы разделите выходной код Морзе на строки, как и входной.

Codelisting
Популярные категории
На заметку программисту