arrays - 如何输入小于 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)
任何帮助,将不胜感激。我想知道分段错误是什么以及它发生在哪里/为什么以及如何解决它。
解决方案
我不知道那是不是一个作业,反正你不应该管理你看不懂的代码。但我会试着理解你。
首先,您会发现分段错误问题通常与数组相关联。这是由非法尝试访问某些内存位置引起的,在这种情况下,程序会尝试读取超出某些数组的内存位置。
现在,为什么它会发生在你的程序中?让我们检查并评论它的冲突部分:
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 学习。
推荐阅读
- php - Imagick .heic 格式在 php (xampp) 中不支持,但在控制台中
- c++ - 如何将 std::set 的比较功能提供给另一个功能
- vb.net - 在 vb.net 中使用 PLplot
- python - 如何根据特定行的列值查询熊猫数据框
- asp.net - 具有本地 .html 内容的 iframe
- r - R中的参数IN SQL
- mysql - Codeigniter 在事务中真正做了什么?锁定表或记录?
- mysql - 具有不同架构的实体似乎没有生成正确的查询
- python - 使用 cleanlab 和 sktime 进行带噪声标签的时间序列分类
- python - 是否可以使用 Obspy 将频谱图的轴从时间 - 频率更改为时间 - 周期?