Как я могу ввести целое число меньше 100 как символьный массив цифр и вывести число в его словесной форме как строку в C? - PullRequest
0 голосов
/ 14 июля 2020

Я хотел бы создать программу C, которая просит пользователя ввести число меньше 100, а затем вывести его в форме слова. Например, вход может быть «53», а я бы хотел, чтобы на выходе было «пятьдесят три». И если ввод - это число, равное или большее 100 (длина строки> = 3), я бы хотел, чтобы вывод был сообщением об ошибке. Пример: ввод - «132», а вывод - «ошибка: число больше или равно 100». Я использовал статью geeksforgeeks (https://www.geeksforgeeks.org/convert-number-to-words/) в качестве руководства, поскольку в учебнике учитываются числа меньше 10000, но я хотел бы учитывать только числа меньше 100. Это мой код. :

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

void convertnumtostring(char *num){
    int len = strlen(num);
    if(len==0){
        fprintf(stderr, "empty string\n");
        return;
    }
    if(len>2){
        fprintf(stderr, "number is is equal to or greater than 100\n");
        return;
    }

    char *singledig[]={"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
    char *doubledig[]={"", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
    char *multiplesoften[]={"", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
        
    printf("\n%s: ", num);
    if(len==1){
        printf("%s\n", singledig[*num - '0']);
        return;
    }
        
    while(*num != '0'){
        if(*num == '1'){
            int sum = *num - '0' + *(num + 1)- '0';
            printf("%s\n", doubledig[sum]);
            return;
        } else if(*num == '2' && *(num + 1) == '0'){
            printf("twenty\n");
            return;
        } else {
            int i = *num - '0';
            printf("%s ", i? multiplesoften[i]: "");
            ++num;
            if(*num != '0')
                printf("%s ", singledig[*num - '0']);
        }
        ++num;
    }
}

int main(void){
    char input[10];
    printf("Enter a number: ");
    scanf("%s", input);
    convertnumtostring(input);
    return 0;   

}

Код работает так, как я хотел бы для чисел больше 99 / длины строк больше 3 (100, 1313, 13235, и т.д. c.), Потому что они получают желаемое сообщение об ошибке и для чисел 0-20 выводится правильная форма слова (ноль, четыре, двадцать и т. д. c.), но для всех других чисел 21-99 я получаю сообщение, в котором говорится:

Segmentation fault (core dumped)

Любая помощь будет быть оцененным. Я хотел бы знать, что это за ошибка сегментации, где / почему она возникает и как ее исправить.

1 Ответ

0 голосов
/ 14 июля 2020

Я не знаю, является ли это заданием, в любом случае вам не следует управлять кодом, который вы не можете прочитать. Но я попытаюсь понять вас.

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

Теперь, почему это происходит в вашей программе? Давайте рассмотрим и прокомментируем его противоречивую часть:

while (*num != '0')
{
    if (*num == '1')
    {
        int sum = *num - '0' + *(num + 1) - '0';
        printf("%s\n", doubledig[sum]);
        return;
    } else if (*num == '2' && *(num + 1) == '0')
    {
        printf("twenty\n");
        return;
    } else
    {
        int i = *num - '0';                         //index ascii offset
        printf("%s ", i ? multiplesoften[i] : "");  //again compares if i is not 0
        ++num;                                      //next digit
        if (*num != '0')                            //is not equal to zero
            printf("%s ", singledig[*num - '0']);   //get by index ascii offset
    }
    
    ++num;//next digit again??? change ++num to break !!!

}

Как видите, после того, как он напечатал число, он продолжает l oop. Таким образом, новый di git будет данными мусора, эти данные будут использоваться для извлечения строки из ваших массивов, используя ее в качестве индекса, и именно это вызывает segfault.

Надеюсь, мое объяснение может помочь вы можете продолжить свое C обучение.

...