printf i klasa niestandardowa
Mam własną klasę, która reprezentuje niestandardową klasę ciągów. Używam VS2012RC. Przeładowałem niektórych operatorów mojej klasy CustomString.
Oto kod:
CustomString::CustomString(string setstr)
{
str = setstr;
}
CustomString::operator const char *()
{
return (this->str.c_str());
}
CustomString &CustomString::operator = (char *setstr)
{
str = setstr;
return *this;
}
Mogę zdefiniować mój obiekt i użyć go w ten sposób:
CustomString str = "Test string";
i mogę wydrukować wynik jako:
printf(str);
printf((string)(str).c_str());
printf((string)(str).data());
printf("%s\n",(string)(str).c_str());
printf("%s\n",(string)(str).data());
I nie ma żadnego błędu.
Ale jeśli użyję tego w ten sposób:
printf("%s\n", str);
Wyjątek w msvcr110d.dll (błąd dostępu do pamięci)
Czemuprintf (str) jest ok, aleprintf ("% s n", str) nie jest ok?
Jak mogę zmodyfikować mój kod do użyciaprintf ("% s n", str) ?
...
Po godzinach googlingu odkryłem, że metoda explict cast (string), static_cast (str) i _str () dodaje znaki zakończone znakiem null: '0';
zmodyfikowałem mój kod jako:
printf("%s\n",str + '\0');
i to zadziałało!
Czy istnieje sposób na zmodyfikowanie mojego niestandardowego konstruktora, aby dodać łańcuch zakończony znakiem NULL i przekazać poprawną wartość za pomocą znaków zakończonych znakiem null, aby uzyskać następujący kod:
printf("%s\n",str);