Переполнение при обращении к переменной Char - C (СИ)
Формулировка задачи:
Делаю все по Подбельскому, но для своей программы, ничего не получается. Собственно сам код:
Выдает ошибку Run-Time Check Failure #2 - Stack around the variable 'S' was corrupted. Следовательно как я понимаю переполняется char?
Что и как сделать ума не предположу, 2 часа мучаюсь с этой проблемой, всё бесполезно(
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
int main()
{int st(int,int);
char S;
unsigned short int res;
unsigned short int Convert_10_29(char *,int);
printf("Vvedite chislo dlja perevoda.\n");
scanf_s("%d",&S);
res=Convert_10_29(&S,2);
printf("%d",res);
}
int st(int x, int n)//Вычисление степени
{int i,iks = 1;
if((x == 0) || (n == 1)) return x;
else if ((x == 1) || (n == 0)) return 1;
else for(i=0;i!=n;i++)
iks*=x;
return iks;
}
unsigned short int Convert_10_29( char *S,int n)//Из псевдодвоичной в десятичную
{int A[100], j=0,x=0;
x=atoi(S);
while (x > 0)
{A[j++] = x % 10;
x/= 10; }
int i,z=0;
for(i=0;i!=j;i++)
{z+=A[i]*st(n,i);
}
return z;
}Решение задачи: «Переполнение при обращении к переменной Char»
textual
Листинг программы
#include <stdlib.h>
#include<stdio.h>
#include <string.h>
int main()
{int st(int,int);
char S[10];
unsigned short int res;
unsigned short int Convert_10_29(char *,int);
printf("Vvedite chislo dlja perevoda.\n");
scanf("%s",S);
res=Convert_10_29(S,2);
printf("%d",res);
}
int st(int x, int n)//Вычисление степени
{int i,iks = 1;
if((x == 0) || (n == 1)) return x;
else if ((x == 1) || (n == 0)) return 1;
else for(i=0;i!=n;i++)
iks*=x;
return iks;
}
unsigned short int Convert_10_29( char *S,int n)//Из псевдодвоичной в десятичную
{int j=10,x=0;
//printf("%d",x);
//while (x > 0)
// {S[j++] = x % 10;
// x/= 10; }
int i,z=0;
for(i=0;i!=j;i++)
{printf("S=%d\n",S[1]);
printf("n=%d\n",n);
printf("z=%d\n",z);
printf("i=%d\n",i);
printf("j=%d\n",j);
if(S[j-i]!=0){
z+=S[j-i]*st(n,i);};
}
return z;
}
Объяснение кода листинга программы
- #include
- подключаем функцию rand() для генерации случайных чисел - #include
- подключаем стандартные функции ввода-вывода - #include
- подключаем функции для работы со строками - int main() - функция main(), которая является точкой входа в программу
- char S[10]; - создаем массив S для хранения строки
- unsigned short int res; - создаем переменную res для хранения результата преобразования
- *unsigned short int Convert_10_29(char ,int);** - функция Convert_10_29 для преобразования строки из псевдодвоичной в десятичную
- printf(
Vvedite chislo dlja perevoda.\n); - выводим сообщение для ввода числа - scanf(
%s,S); - считываем строку с помощью функции scanf() - res=Convert_10_29(S,2); - вызываем функцию Convert_10_29 для преобразования строки S в десятичное число с основанием 2
- printf(
%d,res); - выводим результат преобразования на экран - int st(int x, int n) - функция вычисления степени числа x в степени n
- if((x == 0) || (n == 1)) return x; - проверяем базовые случаи для функции st()
- else if ((x == 1) || (n == 0)) return 1; - проверяем еще два базовых случая для функции st()
- else for(i=0;i!=n;i++) - выполняем итерацию по диапазону от 0 до n-1
- *iks=x;** - умножаем текущее значение iks на x
- return iks; - возвращаем результат вычисления степени
- int j=10,x=0; - инициализируем переменные j и x для функции Convert_10_29()
- for(i=0;i!=j;i++) - выполняем итерацию по диапазону от 0 до j-1
- if(S[j-i]!=0){ - проверяем, если S[j-i] не равно 0
- *z+=S[j-i]st(n,i);** - добавляем значение S[j-i] умноженное на степень n в степени i к переменной z