Какова лучшая практика использования 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);
Другие вопросы по тегам