eddy_em: (Костерок)
eddy_em ([personal profile] eddy_em) wrote2016-07-12 11:56 am

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');
}


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

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org