Я понял, как я могу перевести ввод пользователя в азбуку Морзе. Оно работает. Единственное, что меня беспокоит, это то, что независимо от того, какой ввод я даю, в конце результата написано (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.
Просто включите строку инициализации, в которой говорится
table[`\n`] = "";
Проблема в том, чтоfgets(3)
включает заключительный\n
символ, поэтому вы пытаетесь его распечатать, а запись в таблице для\n
характерNULL
как вы указали в объявлении.
Другое решение - отобразитьtable['\n'] = "\n";
поэтому новая строка отображается в строку с помощью только\n
, и вы разделите выходной код Морзе на строки, как и входной.
morse[i]
ненулевым перед егоif (morse[i]) printf("%s ", morse[i]);
. Ian Abbott'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()
. chux - Reinstate MonicatableSetup
таблицу каждый раз при запуске функции tableSetup? Это крайне неэффективно. Просто создайте свою таблицу как глобальнуюconst char *table[] = ...
Marco BonellitableSetup(sentence[i])
является проблемой, когдаsentence[i] < 0
. Предложитеchar* tableSetup(int i)
->char* tableSetup(unsigned char i)
чтобы избежать отрицательных индексов. chux - Reinstate Monican
global, например, но для таблицы, которая используется снова и снова, это просто очевидный способ (и это также намного быстрее). Marco Bonellistatic
в tableSetup , также он не содержитchar*
ноconst char*
brunochar* table[256]
вы предполагаете, что код символа составляет от 0 до 255, из-за того, что символ может быть подписан, как сигнализируется @ chux-ReinstateMonica, вы не можете предположить, что даже управляяunsigned char
, используйтеUCHAR_MAX+1
илиSCHAR_MAX-SCHAR_MIN+1
brunoif(sentence[i]>=97 && sentence[i]<=122) sentence[i] -=32;
? Вы имели в видуsentence[i] = toupper(sentence[i];
;? Andrew Henleif(sentence[i]>=97 && sentence[i]<=122) sentence[i] -=32;
был самый простой способ, который я имел в виду. Спасибо за совет, воспользуюсь этим вместо моего: D Wladislaw Kusnezow