Преобразовать номер телефона из алфавитного в цифровую форму - PullRequest
2 голосов
/ 07 марта 2019

Я выполняю упражнение из книги KNKings «Программирование на C: современный подход», которое включает преобразование телефонного номера в алфавитном порядке, введенного пользователем, в цифровую форму.Когда программа встречает не алфавитные символы (например, цифры или знаки препинания), она должна оставить их без изменений.Я могу предположить, что пользователь вводит только заглавные буквы.

Однако моя программа, по меньшей мере, производит мусор.

#include <stdio.h>

#define MAX_SIZE 50

int main(void)
{
    char alphabetic[MAX_SIZE], ch;
    int num_elements = 0;

    printf("Enter phone number: ");
    int i;
    for (i = 0; i < MAX_SIZE && ((ch = getchar()) != '\n'); i++){
        alphabetic[i] = ch;
        num_elements++;
    }

    for (i = 0; i <= num_elements; i++){
        switch (alphabetic[i]){
            case 'A': case 'B': case 'C': alphabetic[i] = '2'; break;
            case 'D': case 'E': case 'F': alphabetic[i] = '3'; break;
            case 'G': case 'H': case 'I': alphabetic[i] = '4'; break;
            case 'J': case 'K': case 'L': alphabetic[i] = '5'; break;
            case 'M': case 'N': case 'O': alphabetic[i] = '6'; break;
            case 'P': case 'R': case 'S': alphabetic[i] = '7'; break;
            case 'T': case 'U': case 'V': alphabetic[i] = '8'; break;
            case 'W': case 'X': case 'Y': alphabetic[i] = '9'; break;
            default:                                           break;
        }
    }
    printf("%s\n", alphabetic);
    return 0;
}

В частности, я ввожу: COLLECT-800.Он выводит что-то вроде этого: u░ @ ■ ║k ╩

Что я сделал не так?

Ответы [ 2 ]

4 голосов
/ 07 марта 2019

У вас правильная идея, но в вашей программе отсутствуют две вещи:

  1. Самое главное, нулевой терминатор в конце строки.После цикла for, в котором вы читаете число, добавьте строку:

    alphabetic[i] = '\0';
    
  2. Если пользователь вводит строчные буквы, они игнорируются в операторе switch.Чтобы обойти это, включите <ctype.h> и измените количество switch с alphabetic[i] на toupper(alphabetic[i]).Вызов toupper для уже заглавной буквы является доброкачественным.

4 голосов
/ 07 марта 2019

Вы нигде не ставите нулевой терминатор, поэтому при чтении строки поведение не определено независимо от того, изменили ли вы ее впоследствии.Поместите эту строку:

alphabetic[num_elements] = 0;

После вашего for (i = 0; i < MAX_SIZE &&... цикла.


Лично я бы не делал цикл getchar и вместо этого читал бы в строке так:

scanf("%49s", alphabetic); // reads in a string up to 50 characters
for (i = 0; alphabetic[i]; i++) { ...
...