printf e classe customizada
Eu tenho minha própria classe que representa uma classe de string personalizada. Estou usando o VS2012RC. Eu sobrecarreguei alguns operadores da minha classe CustomString.
Aqui está um código:
CustomString::CustomString(string setstr)
{
str = setstr;
}
CustomString::operator const char *()
{
return (this->str.c_str());
}
CustomString &CustomString::operator = (char *setstr)
{
str = setstr;
return *this;
}
Eu posso definir meu objeto e usá-lo assim:
CustomString str = "Test string";
e eu posso imprimir o resultado como:
printf(str);
printf((string)(str).c_str());
printf((string)(str).data());
printf("%s\n",(string)(str).c_str());
printf("%s\n",(string)(str).data());
E não há erro algum.
Mas se eu usar assim:
printf("%s\n", str);
Há uma exceção em msvcr110d.dll (erro no acesso à memória)
Por quêprintf (str) está ok, masprintf ("% s \ n", str) não está bem?
Como posso modificar meu código para usarprintf ("% s \ n", str) ?
...
Depois de horas pesquisando, descobri que os métodos explict cast (string), static_cast (str) e _str () adicionam um caractere terminado em nulo: '\ 0';
Eu modifiquei meu código como:
printf("%s\n",str + '\0');
e funcionou!
Existe alguma maneira de modificar meu construtor personalizado para adicionar uma seqüência terminada com nulo e passar um valor correto com caracteres terminados com nulo para obter o seguinte código:
printf("%s\n",str);