Ошибка сегментирования. Перевод числа в строковый эквивалент - C (СИ)
Формулировка задачи:
Всем доброго времени суток. Вот и столкнулся я с проблемой которая требует от меня просить помощь у более опытных людей )
В общем, есть код который переводит число в его строковый эквивалент. Программа была написана мной на плюсах и отлично работала, но когда возникла нужда переписать все на си - возникли трудности. Код написан коряво, так что если есть что поправить - не стесняйтесь =)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void FormString(int num);
int razryad(int num);
char *ResultString(int numeric);
int main()
{
int num;
printf("Введите число: ");
scanf("%d", &num);
printf("Введено: %d \n", num);
FormString(num);
return 0;
}
void FormString(int num)
{
char *Razryadi[] = { " ","thousands ", "millions ", "billions "};
int raz, divisor, bufnum;
char *s1=" ";
char *ps=" ";
raz = razryad(num);
for (raz; raz > -1; raz--)
{
divisor = pow((double)1000, (double)raz);
bufnum = num/divisor;
s1= ResultString(bufnum);
num = num%divisor;
strcat(s1, Razryadi[raz]);
printf("%s",s1);
}
printf("\n");
}
int razryad(int num)
{
int raz;
for (raz=0; num/1000 > 0; raz++)
{
num=num/1000;
}
return raz;
}
char *ResultString(int numeric)
{
char *Hundreds[] = {" ", "hundreed "};
char *Tens [] = {"","", "twenty ", "thirsty ", "fourty ", "fifty ", "sixty ", "seventy ", "eighty ", "ninety "};
char *Ones [] = {"", "one ","two ","three ","four ","five ","six ","seven ","eight ","nine ","ten ", "eleven ","twelve ","thirsteen ",
"fourteen ","fiveteen ","sixteen ","seventeen ","eighteen ","nineteen "};
char *Minus [] = {"", "minus"};
int hund, tens, ones;
char *shund = " ";
char *stens = " ";
char *sones = " ";
char *RString = " ";
char *mins = " ";
if (numeric < 0) {mins = Minus[1]; numeric= -numeric;}
hund = numeric/100;
numeric = numeric%100;
tens = numeric/10;
numeric = numeric%10;
ones = numeric;
if (tens ==1)
{
ones = ones + 10;
tens = 0;
}
if (hund < 1)
{
shund = Ones[hund];
strcat(shund, Hundreds[0]);
}
else
{
shund = Ones[hund];
strcat(shund, Hundreds[1]);
}
stens = Tens[tens];
sones = Ones[ones];
strcpy(RString, mins);
strcat(RString, shund);
strcat(RString,stens);
strcat(RString, sones);
return RString;
}Решение задачи: «Ошибка сегментирования. Перевод числа в строковый эквивалент»
textual
Листинг программы
char Sigh[] = "минус"; char *ptria[4], tria[] = "//тысяч$а%и/мE#ов%а/бE#ов%а"; char triaGen[] = "#$##"; char triaVar[] = "#$%%%#####"; char *phuns[10], huns[] = "//Fо/GеFи/3Fа/4еFа/5ьA/6ьA/7ьA/8ьA/9ьA"; char *ptens[10], tens[] = "///GаB/3B/сорок/5ьC/6ьC/7ьC/8ьC/HвяноFо"; char *pones[20], ones[] = "//1/2/3/4е/5ь/6ь/7ь/8ь/9ь/Hсять/одинD/GеD/3D/4D/5D/6D/7D/8D/9D"; char *ptz[20], tz[] = "//од#ин$на/дв#а$е/три/четыр/пят/шест/сем/восем/девят/сот/дцать/десят/надцать/иллион/ст/дв/де";
Объяснение кода листинга программы
- Объявляются массивы символов: Sigh[] =
минус, tria[] =//тысяч$а%и/мE#ов%а/бE#ов%а, triaGen[] =#$##, triaVar[] =#$%%%#####, huns[] =//Fо/GеFи/3Fа/4еFа/5ьA/6ьA/7ьA/8ьA/9ьA, tens[] =///GаB/3B/сорок/5ьC/6ьC/7ьC/8ьC/HвяноFо, ones[] =//1/2/3/4е/5ь/6ь/7ь/8ь/9ь/Hсять/одинD/GеD/3D/4D/5D/6D/7D/8D/9D, tz[] =//од#ин$на/дв#а$е/три/четыр/пят/шест/сем/восем/девят/сот/дцать/десят/надцать/иллион/ст/дв/де. - Создаются указатели на массивы: char ptria[4], char ptens[10], char pones[20], char ptz[20].
- Задаются значения переменных: Sigh[0] = 'м', tria[0] = '//', triaGen[0] = '#', triaVar[0] = '#', huns[0] = 'F', tens[0] = 'G', ones[0] = '1', tz[0] = 'о'.
- Переменные Sigh, tria, triaGen, triaVar, huns, tens, ones, tz используются в дальнейшем коде.