Емельянов Эдуард Владимирович (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

  • Хеши строковых команд для МК

    Долго я к этому шел, но, похоже, пора уже: однобуквенные команды сложно запоминать (особенно если команд толпа, и большая часть с этими буквами…

  • Разбираемся с утечками

    Занялся полным рефакторингом кода системы управления оптоволоконным спектрографом. А глаз уже "замыленный": ну вот не могу сходу обнаружить, где я…

  • Шо, товарищи, facebook и watsapp — тыгыдым?

    Собственно, уже часа 2 с хвостиком не работают. Интересно: это роскомпозор охренел или что? Reposted from dreamwidth:…

promo eddy_em september 3, 12:13 8
Buy for 10 tokens
Уже больше полугода занимаюсь разработкой, вот, наконец-то в мастерских взялись за меня и начали выдавать первые детали. Сегодня сделал тестовую сборку (как обычно, местами пришлось "доработать напильником"): Пока прибор без названия (да и как-то не лезет в голову ничего, у меня нет…
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic
  • 2 comments