Maqsat
@Maqsat
либерал в программировании

Проблемы с фукнцией atoi?

char *temp, s[100];
	int i,len1,pos;
	int a[100]];

 	std::cin>>s;
 	len1 = strlen(s);
 	i = len1-1;

 	while(i>=0)
 	{
 		*temp = s[i];
 		a[pos] = atoi[temp];
 		pos++;--i;
 	}


Тут компилятор выводить ошибку
Segmentation fault (core dumped)
По мне ошибка здесь > *temp = s[i];
Почему то я не могу писать так > a[pos] = atoi[s[i]];
Компилятор g++, версия 5.4
  • Вопрос задан
  • 580 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Maqsat Batyrqul: atoi -- функция из стандартной библиотеки С, она работает с С-строками. С-строка это последовательность символов в памяти, заканчивающаяся символом конца строки -- символом с кодом 0.
Написав *temp = s[i], или что то же самое temp[0] = s[i] вы скопировали i-й символ из строки s на первое место в строке temp. Проблема изначального кода в том, что указатель temp не инициализирован, а значит может указывать в любое место в памяти. Т.е. вы скопировали символ в любое место в памяти. Мест в памяти в которые можно записывать существенно меньше, чем мест, в которые записывать нельзя. По счастливому стечению обстоятельств temp в вашей программе указывал в место, в которое записывать нельзя, в результате чего вы видели Segmentation fault при попытке записать туда.
В отличие от char *temp, запись char temp[2] определяет не указатель, а массив. Массив -- это непрерывный участок памяти. Если массив не константный, в него можно писать. Имя массива в большинстве случаев ведёт себя как указатель на первый элемент массива. Инициализировав массив нулями вы получили два нулевых символа в памяти, в которые можно писать. В цикле вы заменяете первый символ в этом массиве на i-й символ из массива s, второй символ остаётся неизменным -- символом с кодом 0, т.е. символом конца строки. Т.е. массив temp в цикле представляет собой С-строку единичной длины, которую можно передавать на вход atoi.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Wexter
а зачем вы к ней обращаетесь как к массиву?
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы