C Конвертер азбуки Морзе не показывает ошибки в компиляторе, но не работает - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь написать простую программу, которая принимает строковые данные и затем преобразует их в азбуку Морзе.

Когда я компилирую код и запускаю его, я не получаю ошибок, но иногда он дает вывод, иногда нет, иногда дает только половину его.Я могу отчасти понять, что алгоритм, который я использую сейчас, может быть немного медленным для преобразования большой строки, но он выполняет те же функции даже для одного символа.

Так что не так с моим кодом?

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

int main()
{
    char characters[26]= {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
    char *morse[26] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--"," -.","---",".--.","--.-",".-."," ...","-","..-","...-",".--","-..-","-.--","--.."};
    char input[25];
    char *output[25];
    gets(input);

    int i = 0, k = 0; //Make all of the chars uppercase to compare with the array.
    while(i < 25) {
        input[i] = toupper(input[i]);
        while(input[i] != characters[k]){
            k++;
        }
        output[i] = morse[k]; //Assign the according morse code to the output's pointers.
        i++;
    }

    int n = 0;
    while(n < 25){
        if (output[n] != NULL){  //Print out everything except empty parts
            printf("%s", output[n]);
            n++;
        }
        else{
            break;
        }
    }
    return EXIT_SUCCESS;
}  

Ответы [ 4 ]

0 голосов
/ 23 февраля 2019

Комментарий Бармара выше верен.Кроме того, ваша программа зависит от пользователя, который вводит строку, состоящую полностью из символов.Как вы думаете, что произойдет в вашем внутреннем цикле while, если ваша строка содержит, скажем, «1»?

0 голосов
/ 23 февраля 2019

Вам нужно установить k в ноль каждый раз, когда вы будете искать characters.Поскольку вы этого не делаете, вы начинаете поиск с позиции, которая закончилась последним поиском.Если следующий символ находится в алфавите раньше, вы не найдете его, и поиск будет считан вне массива.

Кроме того, если какой-либо из вводимых символов не является буквой, поиск никогда не найдет его,Цикл не проверяет это.

Более простой метод - сначала проверить isalpha(), чтобы убедиться, что ввод является буквой, а затем вычислить input[i] - 'A' и использовать его в качестве индекса для * 1009.*.

При обработке input вы должны остановиться, когда доберетесь до нулевого терминатора, а не идти до i = 24.

int i = 0;
while (input[i]) {
    if (isalpha(input[i])) {
        input[i] = toupper(input[i]);
        output[i] = morse[input[i] - 'A'];
    } else {
        output[i] = NULL;
    }
    i++;
}
0 голосов
/ 23 февраля 2019

Используйте fgets для получения ввода переменной длины (просто дайте ему символьный указатель). Используйте strlen, чтобы получить ввод длины для управления вашим циклом.Вы также можете сбросить значение k при увеличении i, чтобы не выходить за пределы в массиве символов.

0 голосов
/ 23 февраля 2019

Некоторые замечания:

  • while(i < 25) должно быть while(input[i] != 0)

  • Вам также необходимо сбросить k до 0 в while(input[i] != 0) (если используется связанный цикл)

  • не использовать получает , но fgets

  • Вам также необходимо изменить while(n < 25) на while (n < i).Ваш output[n] != NULL не является защитой, потому что вывод не инициализирован в NULL, поэтому вы получаете доступ к неинициализированному значению со связанным неопределенным поведением

  • , вам нужно прочитатьтолько буква while(input[i] != characters[k]) выйдет из символов .Поиск кода через цикл также обходится дорого, просто используйте код символа - «A» для индекса

Наконец, предложение:

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

int main()
{
    const char * const morse[] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--"," -.","---",".--.","--.-",".-."," ...","-","..-","...-",".--","-..-","-.--","--.."};
    char input[25];
    const char *output[25];

    if (fgets(input, sizeof(input), stdin) == NULL)
      return 0;

    int i = 0; //Make all of the chars uppercase to compare with the array.

    while((input[i] != 0) && isalpha(input[i])) {
      char c = toupper(input[i]);

      output[i++] = morse[c - 'A']; //Assign the according morse code to the output's pointers.
    }

    int n = 0;
    while (n < i)
      printf("%s", output[n++]);

    putchar('\n');

    return EXIT_SUCCESS;
}  

Компиляция и исполнение:

pi@raspberrypi:/tmp $ gcc -g -Wextra mo.c
pi@raspberrypi:/tmp $ ./a.out
SOS
 ...--- ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...