首页 > 解决方案 > 如何输入小于 100 的整数作为数字字符数组,并将其单词形式的数字输出为 C 中的字符串?

问题描述

我想创建一个 C 程序,要求用户输入小于 100 的数字,然后以单词形式输出。例如,输入可能是“53”,我希望输出是“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 等),该代码可以正常工作,因为它们会收到我想要的错误消息,并且对于数字 0-20,输出正确的单词形式(零、四、二十等),但对于所有其他数字 21-99,我收到一条消息说

Segmentation fault (core dumped)

任何帮助,将不胜感激。我想知道分段错误是什么以及它发生在哪里/为什么以及如何解决它。

标签: arrayscstringiocharacter

解决方案


我不知道那是不是一个作业,反正你不应该管理你看不懂的代码。但我会试着理解你。

首先,您会发现分段错误问题通常与数组相关联。这是由非法尝试访问某些内存位置引起的,在这种情况下,程序会尝试读取超出某些数组的内存位置。

现在,为什么它会发生在你的程序中?让我们检查并评论它的冲突部分:

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 !!!

}

如您所见,一旦打印了数字,它就会继续循环。这样,新数字将是垃圾数据,该数据将用于从数组中检索字符串,并将其用作索引,这就是导致段错误的原因。

我希望我的解释可以帮助你继续你的 C 学习。


推荐阅读