Какова лучшая практика использования itoa()?
Когда я использую itoa(), ему нужен символ * _DstBuff, что является лучшим вариантом здесь?
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int num = 100;
// I'm sure here is no memory leak, but it needs to know the length.
char a[10];
// will this causue memory leak? if yes, how to avoid it?
// And why can itoa(num, b, 10); be excuted correctly since b
// has only allocated one char.
char *b = new char;
// What is the difference between char *c and char *b
// both can be used correctly in the itoa() function
char *c = new char[10];
itoa(num, a, 10);
itoa(num, b, 10);
itoa(num, c, 10);
cout << a << endl;
cout << b << endl;
cout << c << endl;
return 0;
}
выход: 100 100 100
Так может кто-нибудь объяснить разницу между char *b = new char;
а также char *c = new char[10];
Вот?
я знаю char *c
будет динамически выделять 10 символов, но это означает, char *b
будет только динамически выделять 1 символ, если я прав в этом, почему вывод все правильно?
на самом деле, что является лучшей практикой a, b или c?
4 ответа
Лучшая практика: не используйте его вообще.
Зачем? Потому что это не в стандарте.
Что мне делать вместо этого? использование std::to_string
,
(Если вы действительно застряли от необходимости itoa
затем используйте большой локальный статический буфер, например char[512]
или около того - если вы хотите быть действительно действительно безопасным, вы можете сделать размер массива sizeof(unsigned long long int) * CHAR_BIT + 2
или что-то подобное, так что он всегда может содержать любое число, выраженное в любой базе, плюс знак.)
В этом вопросе, который я поставил, вы найдете дюжину эффективных функций для преобразования целого числа в строку, все из которых выделяют и возвращают std::string
так что вам не нужно беспокоиться о переполнении буфера. И несколько вариантов там быстро появляются.
То, что вы описываете, это не утечка памяти, а переполнение буфера.
По сути, вам повезло. Если вы выделяете только один символ, но затем записываете в него четыре символа, вы перебираете то, что было выделено вам, и это ошибка.
cout << b << endl;
: неверно, это переполнение буфера. потому что вы выделяете 1 байт памяти, чтобы содержать один символ. но вы пишете на нем с itoa()
10+1chars.
поэтому вы должны выделить: char * d = new char[11]; // 10 chars + '\0'(end of string char).
затем используйте itoa(num , d , 10);
к тому же itoa()
не является стандартным, поэтому я предпочитаю использовать стандарт sprintf(d,"%d",num);
и, как сказано в комментарии ниже, если вам не нужно char*
и вы можете использовать std::string
, использование
string d = std::to_string(num);