На входе у меня вещественное число. Выводит неверный результат Size_of_Man = 14, которое должно читать мне длину массива Man . А Size_of_Num печатает верно, вроде я одинаково использовала обе переменные и массивы. Что не так с Man[]; Size_of_Man?
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define OK 0
#define UN_RIGHT_SINTAKSIS 1
#define ZERO 3
// сдвигает массив на shift элементов влево
int Shift(char Num[], const int Num_L, const int shift)
{
int i;
if (shift == 0)
return OK;
for(i = 0; i < Num_L-shift; i++)
{
Num[i] = Num[i+shift];
}
return OK;
}
// проверяет действительное число на правильность ввода
int Take_Number2 (char Num_2[], char *Man_Sign, char *Por_Sign,int *Num_L, int *Man_L, char Man[], char Por[], int *Por_L)
{
// int Por_L = 0;
int i = 0;
int Presence_sign = 0;
// знак мантиссы числа
if ((Num_2[0] == '+') || (((int)Num_2[0] >47) && ((int)Num_2[0] < 58)))
*Man_Sign = '+';
else
{
if (Num_2[0] == '-')
*Man_Sign = '-';
else
return UN_RIGHT_SINTAKSIS;
}
if ((Num_2[0] == '+') || (Num_2[0] == '-'))
{
i++;
Presence_sign = 1;
}
// Размер массива без знака
size_t Size_of_Num= strlen(Num_2) - Presence_sign;
printf("\nSize_of_Num =%d\n", Size_of_Num);
// подсчёт мантиссы числа
int Col_point = 0;
// int Por_Man = 0;
int Pos_point = 0;
*Man_L = 0;
// создаем массив мантиссы без знака и запятой
for (;(((((int)Num_2[i] >47) && ((int)Num_2[i] < 58)) || (Num_2[i] == '.')) && (*Man_L < 30)); i++)
{
if (Num_2[i] == '.')
{
Col_point ++;
Pos_point = i;
printf("\nCol_point = %d\n", Col_point);
if (Col_point > 1)
return UN_RIGHT_SINTAKSIS;
}
else
{
if (Col_point == 1)
{
Man[*Man_L] = Num_2[i];
printf("\nMan[%d] = %c\n", *Man_L, Man[*Man_L]);
(*Man_L)++;
}
}
}
printf("Man_L = %d", *Man_L);
printf("i= %d", i);
// Размер мантиссы без знака
size_t Size_of_Man= strlen(Man) ;
printf("\nSize_of_Man= %d", strlen(Man));
// если числа то...
if (*Man_L == Size_of_Man)
{
// если число начинается на нули
for (i = 0; Man[i] == '0'; i++);
{
if (Col_point == 1)
{
if (((Size_of_Man> 2) && ( i == Size_of_Man)) || (i -Presence_sign == Size_of_Man))
return ZERO;
}
if (((Size_of_Man> 2) && ( i == Size_of_Man)) || (i -Presence_sign == Size_of_Man))
return ZERO;
}
if (i -Presence_sign == Size_of_Man)
{
Shift(Man,*Man_L,i-Presence_sign-1);
(*Man_L) -= (i-Presence_sign-1);
}
else
{
Shift(Man,*Man_L,i);
(*Man_L) -= i;
}
for(i = *Man_L; i > -1; i--)
{
Man[i] = Man[i-1];
if (i == 0)
{
Man[i] = *Man_Sign;
}
}
}
else
return UN_RIGHT_SINTAKSIS;
if (Num_2[i] == 'E')
i++;
// знак порядка
if ((Num_2[i] == '+') || ((Num_2[i] >47) && (Num_2[i] < 58)))
*Por_Sign = '+';
else
{
if (Num_2[i] == '-')
*Por_Sign = '-';
else
return UN_RIGHT_SINTAKSIS;
}
if ((Num_2[i] == '+') || (Num_2[i] == '-'))
{
i++;
Presence_sign = 1;
}
// подсчет порядка числа
if (Num_2[i] > 47 && Num_2[i] < 58)
return UN_RIGHT_SINTAKSIS;
i =(int)*Man + *Man_L - Pos_point +1;
*Por = (char) i;
printf("\n NUM_2 \n%s\n", Num_2);
printf("\n Man \n%s\n", Man);
printf("\n Por \n%s\n", Por);
//printf("\n NUM_2 \n%s\n", Num_2);
return OK;
}
int main (void)
{
char Num_2[41]; // числа 1, 2
char Man[31]; // мантисcа числа
char Num_Sign, Man_Sign, Por_Sign; // знак мантисcы и числа
char Por [5]; // порядок чисел 1, 2
int Num_L, Man_L, Por_L; // длина числа и мантиссы
char Result[32] = {0}; // мантисcа, порядок результата
int n, l;
setlocale(0, "russian");
printf("Input the second number:\n <-30\n");
scanf("%s", Num_2);
l = Take_Number2 (Num_2, &Man_Sign, &Por_Sign,&Num_L, &Man_L, Man, Por,&Por_L);
if (l == UN_RIGHT_SINTAKSIS)
{
printf("\nError 1: Incorrect input.\n");
printf("%s", Num_2);
system("pause");
return 0;
}
else
if (l == ZERO)
{
printf("Input the second number:\n <-30\n");
printf("%s", Num_2);
printf("On 0 can't divide!");
system("pause");
return 0;
}
else
{
printf("Input the second number:\n <-30\n");
printf("%s", Num_2);
printf("The result of dividing is:%s", Result);
system("pause");
}
}