Емельянов Эдуард Владимирович (eddy_em) wrote,
Емельянов Эдуард Владимирович
eddy_em

Category:

itoa?

На ЛОРе наткнулся на вопрос и подумал: а ведь действительно в стандартной библиотеке нет функции, которая бы преобразовывала число в строку без излишних манипуляций с жирным sprintf вроде предложенных мною там:

char *itoa(int i){
	int L = 2;
	char *str = malloc(L);
	int rest = snprintf(str, L, "%d", i);
	if(rest){
		L = rest+1;
		str = realloc(str, L);
		snprintf(str, L, "%d", i);
	}
	printf("allocated %d bytes\n", L);
	return str;
}
}

или
char *itoa(int i){
	char buf[32];
	snprintf(buf, 32, "%d", i);
	char *str = strdup(buf);
	printf("allocated %d bytes\n", strlen(str)+1);
	return str;
}

В случае с целыми числами можно, конечно, заменить snprintf в первом варианте на постепенное заполнение буфера. В случае же с плавающей точкой и отсутствием ограничения по формату (вроде %8.3f), получается жесть!

Если на компьютере как-то плевать, то на микроконтроллерах приходится выкручиваться через одно место. Благо, на микроконтроллерах нафиг не сдались числа с плавающей запятой — в основном все элементарно на целых или числах с фиксированной запятой (т.е. опять же через целые) выполняется.

Я для вывода целых в терминал каких только макросов не клепал... Самая большая пакость в том, что приходится реверсить строку, т.е. без вспомогательного буфера не обойтись. И получается вот такая бяка:
void print_int(int32_t N){
	uint8_t buf[10], L = 0;
	if(N < 0){
		usb_send('-');
		N = -N;
	}
	if(N){
		while(N){
			buf[L++] = N % 10 + '0';
			N /= 10;
		}
		while(L--) usb_send(buf[L]);
	}else usb_send('0');
}


К чему это? Да к тому, что это ж полная жесть: языку С уже лет и годочков, а элементарные вещи постоянно приходится велосипедить! Я уж молчу, какая жесть творится в области обработки изображений (за недописанным велосипедом далеко ходить не нужно), а уж про робастные методы лучше вообще как о страшном сне забыть (иначе реально можно о снах забыть ☹).
Tags: c, всячина, негодую
Subscribe

  • Чем бы таким заменить STM32F072C8T6?

    Полез сейчас на али цены посмотреть, а там… В среднем уже по 600-700 рублей за штучку просят! Вообще охамели. И это - гарантированно БУшные ведь!.. А…

  • Понаблюдал, блин!

    Опять у нас что-то с сетью поломали. Хотел было протестировать, как наша подвесная часть оптоволоконного спектрографа работает, а из дома связь с…

  • Дохлый SSD

    Писал уже о китайском SSD, сдохшем за полтора месяца работы. Вот он, герой: Сегодня у нас опять работы с оптоволоконным спектрографом на цейссе,…

promo eddy_em august 17, 2019 12:33 3
Buy for 10 tokens
Юра намедни напечатал корпус для хронометра. Для первого блина получилось неплохо: И еще немного фотографий:
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 2 comments