_tcsupr_s richtig angewandt, nur wie?
-
Hallo,
habe hier folgenden Codeausschnitt:
int funk(const TCHAR *value, int i) { TCHAR *mystr = _tcsupr(_tcsdup(value)); }Nun sagt mir VS2005 natürlich, das ich nicht "_tcsupr", sondern besser _tcsupr_s nehmen soll weil die super sicher ist. Habe schon einiges probiert, kriege es aber ums verrecken nicht zum rennen.
So habe ich es probiert:
int size_value = sizeof(value); //weil _tcsupr_s die Größe des Buffers will char* temp = _tcsdup(value); //*temp[size_value] ="\0"; //hatte ich probiert, weil er sage dass der String nicht null-terminated ist. Geht aber nicht weil es eine ungültige Dereferenzierung ist _tcsupr_s(temp, size_value); TCHAR *mystr = temp;Ich glaube dass ich irgend einen total grundlegenden Fehler mache, und hoffe dass mir jemand auf die Sprünge helfen kann weil momentan sehe ich gar nix mehr

Danke schon mal im Voraus...
-
Gast34937 schrieb:
int size_value = sizeof(value); //weil _tcsupr_s die Größe des Buffers will
sizeof(value) ist aber nicht die Größe des Puffers. sizeof(value) ist sizeof(TCHAR*), und das ist auf einem 32Bit-System üblicherweise 4.
Du kannst aus einem Zeiger nicht die Größe des Puffers ermitteln. Die müsstest du schon mit übergeben. Die Größe des Puffers, auf den value zeigt, ist hier aber gar nicht relevant. Es geht um die Größe des Puffers, auf den der Rückgabewert von _tcsdup zeigt.
Da _tcsdup aber automatisch Speicher in passender Größe anfordert, ist _tcsupr_s hier auch nicht sicherer als _tcsupr. Du solltest allerdings prüfen, ob _tcsdup nicht NULL zurückgibt.
-
Hallo,
vielen Dank für die Antwort. Habe ich nicht trotzdem eine Möglichkeit, die _tcsupr_s zu verwenden, ohne die Größe des Puffers zu übergeben? Kann ich vielleicht einfach 100 als Größe übergeben, wenn ich weiß dass es definitiv nicht mehr sein wird, oder ist die genaue Größe erforderlich?
Ich würde halt gerne die Warnung los werden, ohne Warnungen auszuschalten.
-
Du kannst mit _tcslen die Länge des von _tcsdup zurückgegebenen Strings ermitteln, das um 1 erhöhen und als Länge angeben.
-
Vielen Dank!