Переполнение при обращении к переменной Char - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Делаю все по Подбельскому, но для своей программы, ничего не получается. Собственно сам код:
#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;
}
Выдает ошибку Run-Time Check Failure #2 - Stack around the variable 'S' was corrupted. Следовательно как я понимаю переполняется char? Что и как сделать ума не предположу, 2 часа мучаюсь с этой проблемой, всё бесполезно(

Решение задачи: «Переполнение при обращении к переменной 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;
}

Объяснение кода листинга программы

  1. #include - подключаем функцию rand() для генерации случайных чисел
  2. #include - подключаем стандартные функции ввода-вывода
  3. #include - подключаем функции для работы со строками
  4. int main() - функция main(), которая является точкой входа в программу
  5. char S[10]; - создаем массив S для хранения строки
  6. unsigned short int res; - создаем переменную res для хранения результата преобразования
  7. *unsigned short int Convert_10_29(char ,int);** - функция Convert_10_29 для преобразования строки из псевдодвоичной в десятичную
  8. printf(Vvedite chislo dlja perevoda.\n); - выводим сообщение для ввода числа
  9. scanf(%s,S); - считываем строку с помощью функции scanf()
  10. res=Convert_10_29(S,2); - вызываем функцию Convert_10_29 для преобразования строки S в десятичное число с основанием 2
  11. printf(%d,res); - выводим результат преобразования на экран
  12. int st(int x, int n) - функция вычисления степени числа x в степени n
  13. if((x == 0) || (n == 1)) return x; - проверяем базовые случаи для функции st()
  14. else if ((x == 1) || (n == 0)) return 1; - проверяем еще два базовых случая для функции st()
  15. else for(i=0;i!=n;i++) - выполняем итерацию по диапазону от 0 до n-1
  16. *iks=x;** - умножаем текущее значение iks на x
  17. return iks; - возвращаем результат вычисления степени
  18. int j=10,x=0; - инициализируем переменные j и x для функции Convert_10_29()
  19. for(i=0;i!=j;i++) - выполняем итерацию по диапазону от 0 до j-1
  20. if(S[j-i]!=0){ - проверяем, если S[j-i] не равно 0
  21. *z+=S[j-i]st(n,i);** - добавляем значение S[j-i] умноженное на степень n в степени i к переменной z

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.143 из 5
Похожие ответы