@justSMTH

C выдаёт ошибку при попытке сравнить 2 int?

При попытке сравнить 2 инта выдаёт ошибку:
Вызвано исключение по адресу 0x00007FF8D58C590B (ucrtbased.dll) в Project1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x0000000000000035.

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <math.h>
void rev(const char* const c)
{
	if (*c)
	{
		rev(c + 1);
		putchar(*c);
	}
}

int strfind(const char* const c, char* a) {

}
int Convert() {
	setlocale(LC_ALL, "Rus");
	char alph[36] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	int s1, s2;
	char num[37], result[10000] = "";
	printf("Введите систему счисления числа, которое надо преобразовать \n");
	scanf("%d", &s1);
	printf("Введите число до 36 символов \n");
	scanf("%s", &num);
	printf("Введите систему счисления числа, которое надо преобразовать \n");
	scanf("%d", &s2);
	long numInTenSys = 0;
	int n = strlen(num);
	num[n] = 0;
	long preresult;
	long preresult2;
	int substring;
	
	for (int i = 0; i < n; i++) {
		preresult = pow(s1, (n - i -1));
		substring= num[i];
		preresult2 = strchr(alph, substring) - alph;
		numInTenSys += preresult*preresult2;
	}
	int mod, div;
	while (1) {
		mod = numInTenSys % s2;
		div = numInTenSys / s2;
		strcat(result, alph[mod]);
		if (div < s2) { \\Здесь выдаёте ошибку
			strcat(result, alph[div]);
			break;
		}
		numInTenSys = div;
	}
	rev(result);
	printf("%s", result);
	return 0;
}
  • Вопрос задан
  • 105 просмотров
Пригласить эксперта
Ответы на вопрос 3
wataru
@wataru
Разработчик на С++, экс-олимпиадник.
Отключити оптимизацию и соберите проект в режиме Debug.

У вас там Undefined Behavior и, очевидно, проблемы работы с памятью. Ошибку вы замечаете не там, где она, собственно, происходит.

Сразу вижу проблему вот тут:
strcat(result, alph[mod]);

Тут вы приписываете строку с адресом alph[mod] к строке по адресу result. Обратите внимание, не строку, начинающуюся с позиции mod в массиве alph, а строку с адресом вроде кода символа 'F'.

Ну и, вряд ли вы хотите часть строки alph скопировать в result. Плюс у вас в alph[] нет места под терминирущий 0, поэтому strcat вызовет переполнение буфера. Вам там надо дописывать один символ в конец result. Библиотечных функций именно для этого нет. Заведите счетчик количества символов в ответе и тупо переписывайте значение result[cnt].
Ответ написан
@vanyamba-electronics
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <math.h>
void rev(const char* const c)
{
  if (*c)
  {
    rev(c + 1);
    putchar(*c);
  }
}

int strfind(const char* const c, char* a) {
    return -1;
}

int main() {
  setlocale(LC_ALL, "");
  char alph[37] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  int s1, s2;
  char num[37], result[10000] = "";
  printf("Введите систему счисления числа, которое надо преобразовать \n");
  scanf("%d", &s1);
  printf("Введите число до 36 символов \n");
  scanf("%s", num);
  printf("Введите систему счисления числа, которое надо преобразовать \n");
  scanf("%d", &s2);
  long numInTenSys = 0;
  int n = strlen(num);
  num[n] = 0;
  long preresult;
  long preresult2;
  int substring;
  
  for (int i = 0; i < n; i++) {
    preresult = pow(s1, (n - i -1));
    substring= num[i];
    preresult2 = strchr(alph, substring) - alph;
    numInTenSys += preresult*preresult2;
  }
  int mod, div;
  while (1) {
    mod = numInTenSys % s2;
    div = numInTenSys / s2;
    strcat(result, &(alph[mod]));
    if (div < s2) { //Здесь выдаёте ошибку
      strcat(result, &(alph[div]));
      break;
    }
    numInTenSys = div;
  }
  rev(result);
  printf("%s", result);
  return 0;
}
Ответ написан
Комментировать
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Явно ошибка работы с памятью, вангую неинициализированный указатель или недостаточно выделенное место.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы