Fehlermeldung bei der Konvertierung von String zu wchar_t
-
Hallo C++-Experten,
ich arbeite an einer C++ Funktion die einen String zu wchar_t wandelt.
Hier mein Coding-Schnippsel:wchar_t* stringToWchar_t(const string &str) { // 1. String zu Char-Array const char* str_to_char = new char[str.length()]; str_to_char = str.c_str(); // 2. Char-Array zu wchar_t size_t origsize = str.length(); const size_t newsize = 100; size_t convertedChars = 0; wchar_t wcstring[newsize]; mbstowcs_s(&convertedChars, wcstring, origsize, str_to_char, _TRUNCATE); return wcstring; }Das Programm stürzt beim Aufruf ab. Irgendwie sehe ich den Wald vor lauter Bäume nicht. Kann mir einer helfen den Fehler zu finden?
Danke im Voraus.
-
Sehr viele Fehler:
Zeile 1: Warum kein wstring als Rückgabewert?
Zeile 4: Was soll das new dort? Wozu soll das überhaupt gut sein?
Zeile 5: Und schon ist der Wert des Zeigers aus Zeile 4 futsch und ein Speicherloch da. Wenn man mit C-Strings fummeln will, sollte man auch wissen, wie man sie benutzt
Zeile 8: Wozu?
Zeile 9: Wozu? Warum 100?
Zeile 11: Unportables VLA. Kein C++-Standard. Wozu?
Zeile 13: Bumm! Zeiger auf lokale Variable zurück gegeben. Wenn man mit Arrays fummeln will, sollte man auch wissen, wie man sie benutzt.Insgesamt: Zu kompliziert. Zu viel C, ohne C zu können.
Ungetestet:
wstring result(source.begin(), source.end());Sollte es schon tun.
-
Hallo SeppJ,
ich denke das Forum ist genau dazu da um Fragen zu stellen. Deine Antwort ist sehr negativ und macht nicht wirklich Lust sich noch ein mal an das Forum zu wenden.Außerdem was mein Coding anbetrifft, habe ich nie behauptet C oder C++ zu können. Ich arbeite normalerweise mit anderen Programmiersprachen und das nur seit kurzer Zeit.
Nun die Antworten zu den von dir fast allen angemeckerten Zeilen
Zeile 1: Ich brauch wchar_t* als Parameter für eine andere Funktion
Zeilen 4-5 : Ich habe angenommen man muss zuerst den String in ein Char-Arary umwandeln um daraus später ein Wchar_t zu erstellen.
Zeilen 8-11: dienen dazu die Parameter für den Aufruf von mbstowcs_s() vorzubereiten.
-
alreemmi schrieb:
Hallo SeppJ,
ich denke das Forum ist genau dazu da um Fragen zu stellen. Deine Antwort ist sehr negativ und macht nicht wirklich Lust sich noch ein mal an das Forum zu wenden.Ich versuche meine Antwort möglichst sachlich zu geben. Warum sollte ich schönreden, was schlecht ist?
Außerdem was mein Coding anbetrifft, habe ich nie behauptet C oder C++ zu können. Ich arbeite normalerweise mit anderen Programmiersprachen und das nur seit kurzer Zeit.
Das ist vielleicht ein Grund, aber dadurch wird es auch nicht richtig.
Nun die Antworten zu den von dir fast allen angemeckerten Zeilen
Zeile 1: Ich brauch wchar_t* als Parameter für eine andere FunktionDas ist kein guter Grund, aus einem wstring kannst du leicht einen wchar_t* machen. Aber Zeiger aus einer Funktion zurück zu geben ist sehr tückisch und fast nie richtig. Es dürfte hier die direkte ursache für den Absturz sein (der Rest ist aber trotzdem auch falsch)
Zeilen 4-5 : Ich habe angenommen man muss zuerst den String in ein Char-Arary umwandeln um daraus später ein Wchar_t zu erstellen.
Hast du aber nicht. Du hast ein paar Zeiger verbogen und Speicherlöcher erzeugt. Wenn du mit char-Arrays hantieren willst, dann musst du auch wissen, wie es geht. Die sind nun einmal auch sehr schwierig zu benutzen. Aber du brauchst das auch gar nicht, aus einem String kannst du leicht ein Zeiger auf einen C-String machen.
Zeilen 8-11: dienen dazu die Parameter für den Aufruf von mbstowcs_s() vorzubereiten.
8: Dann gib es doch direkt beim Aufruf an, ohne temporäre Variable
9: Wie kommst du auf 100? Du weißt doch, wie viele Zeichen das Ergebnis haben wird? Warum ein temporärer Zwischenwert
10: Ist ok.
11: Ist wie gesagt komplett falsch. Du benutzt da irgendeine unportable Compilererweiterung, dazu auch noch falsch. Hier sollte besser ein wstring stehen, wenn du es nicht sowieso so machen willst, wie ich vorgeschlagen habe.