Переполнение при обращении к переменной 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д