"String is not NULL Termited"
-
hi Leute,
ich schreibe gerade an einem Programm in dem durch Knopfdruck 2 Editfenster ausgelesen und in eine .txt Datei geschrieben werden sollen.
Der Inhalt des ersten Fensters soll gleichzeitig der Name der Datei sein.
Der Fehler ist das wenn ich auf den Knopf drücke. Eine Fehlermeldung kommt
unzwar ungefähr diese:http://nagareshwar.securityxploded.com/images/strlwr_crash_asert_screen.JPG
der Code:
if (lParam == (LPARAM)hWndBtn1) { TCHAR buffer1[30]; TCHAR buffer2[50] char charBuffer1[30]; char charBuffer2[50]; char dateiBuffer[30]; GetWindowText(hWndEdit1, buffer1, 50); \\Text im ersten Fenster GetWindowText(hWndEdit2, buffer2, 50); WideCharToMultiByte(CP_ACP, 0, buffer1, wcslen(buffer1)+1, charBuffer1 , sizeof(charBuffer1), NULL, NULL); WideCharToMultiByte(CP_ACP, 0, buffer2, wcslen(buffer2)+1, charBuffer2 , sizeof(charBuffer2), NULL, NULL); strcat_s(dateiBuffer, 30, "\"..\\Test\\"); strcat_s(dateiBuffer, 30, charBuffer1); \\dateiBuffer + Text im ersten Fenster strcat_s(dateiBuffer, 30, ".txt\""); datei = new FILE; fopen_s(&datei, dateiBuffer, "w"); //usw..... }Frage: Wie bekomme ich die Nullen weg? Wenn das der Fehler ist.
-
Ich würde mal behaupten, dass
TCHAR buffer1[30];und
GetWindowText(hWndEdit1, buffer1, 50);nicht zusammenpassen (der Puffer hat eine Größe von 30, aber du gibst 50 an).
-
ups.. stimmt. aba das is ja leider nicht der grund für den fehler.
-
wo ist denn zeile 128?
Die nachricht sagt aber auch <L"String is NOT null terminated" && 0>,..
-
das is nicht der echte Fehler. dort steht eig.
Programm: f:\blabla...\tutorial.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\tcscat_s.inl
Line: 32Im Quelltext wird auf der Zeile nur eine Variable deklariert, die garnix damit zu tun hat :
HACCEL hAccelTable;
und natürlich auch <L"String is NOT null terminated" && 0>
also eig ist sonnst alles gleich ausser die 3 sachen die oben stehn.
-
strcat erwartet ein nullterminiertes char-Array. dateiBuffer ist nicht nullterminiert.
Initialisiere dateiBuffer ordentlich oder benutz an Stelle des ersten strcat strcpy.
-
habe jetzt strcpy_s versucht. Wenn ich jetzt klicke. lass ich überprüfen und die datei kann nicht geöffnet werden und dazu kommt auchnoch der fehler der schon die ganze zeit kommt.
was is denn an der variable falsch initialisiert?
wie mach ich das richtig?
-
metapoint2011 schrieb:
habe jetzt strcpy_s versucht.
Ich hoffe, du hast jetzt nicht jedes strcat durch strcpy ersetzt...
metapoint2011 schrieb:
Wenn ich jetzt klicke. lass ich überprüfen und die datei kann nicht geöffnet werden und dazu kommt auchnoch der fehler der schon die ganze zeit kommt.
Fang doch mal mit den Grundlagen der Fehlersuche an. Funktionen wie GetWindowText und WideCharToMultiByte haben Rückgabewerte, die man auswerten kann.
Lass dir den Dateinamen mal ausgeben, bevor du fopen aufrufst.Ansonsten ist es auch nicht verboten, den Debugger anzuwerfen.
metapoint2011 schrieb:
was is denn an der variable falsch initialisiert?
Deine Arrays sind überhaupt nicht initialisiert, da steht drin, was immer da gerade im Speicher rumlag. Das ist spätestens dann ein Problem, wenn du eine Funktion aufrufst, die etwas anderes erwartet, wie eben strcat.
metapoint2011 schrieb:
wie mach ich das richtig?
Im Falle von strcat reicht ein einfaches
char dateiBuffer[30] = "";
-
habe strcpy_s nur beim ersten benutzt.
habe dateiBuffer initialiesiert wie du gesagt hast.
immernoch die gleichen Fehler.
jetzt schau ich mal wie dateiBuffer aussieht.
nur muss ich es dann wieder in TCHAR umwandeln um es mit TextOut
auszugeben. kann das sein, das es dann wieder anderst aussieht?
-
metapoint2011 schrieb:
anderst

-
habs versucht also mit TextOut wird garnix ausgegeben. Nicht ein Buchstabe.
vergiss das mit dem anders.
-
metapoint2011 schrieb:
nur muss ich es dann wieder in TCHAR umwandeln um es mit TextOut
auszugeben.Nimm MessageBox für TCHAR-Arrays und MessageBoxA für char-Arrays. Oder eben den Debugger.
-
Du versuchst, ein uninitialisiertes Array an strcat zu übergeben, dies führt zu undefiniertem Verhalten. Außerdem kannst du das Konvertieren vermeiden, indem du dein Projekt von Unicode auf Multibyte umstellst oder gleich Funktionen wie _wfopen benutzt.
Ein
new FILEführt zu einem Speicherleck. Wenn du schon mit C++ programmierst, kannst du auch gleich std::strings und streams verwenden und machst solche einfachen Fehler nicht mehr.Zu TextOut: In welchen DC schreibst du denn? Sinnvollerweise lässt man sich für solche Fälle eine MessageBox ausgeben oder man nutzt einfach den Debugger.
-
hab jetzt geschafft das es geht. habe die \" ab anfang und ende weggelassen

wie einfach das eigentlich war.Nur da ihr viele Fehler gefunden habt. wie is das z.b mit dem new FILE.
Wie sollte ich das anderst machen?eigentlich programmieren ich in c.
-
metapoint2011 schrieb:
eigentlich programmieren ich in c.
Da machst du doch auch kein malloc für ein FILE, oder?
-
malloc ist c++ oder nicht?
-
metapoint2011 schrieb:
eigentlich programmieren ich in c.
metapoint2011 schrieb:
malloc ist c++ oder nicht?
Das passt jetzt irgendwie nicht zusammen...
Wie benutzt du FILE und fopen in C?
-
hab ich von hier: file:///C:/Desktop/c_von_a_bis_z/016_c_ein_ausgabe_funktionen_005.htm#mj47f082541eb4df9dbdcefdbc2775feae
-
Achso. Ein weiteres Jürgen Wolf Opfer.
Aber das steht da so nicht wirklich drin, oder?Edit: Ein Link auf einen Dateipfad auf deiner Festplatte bringt nicht wirklich was.
-
das mit dem new FILE glaube ich nicht..
weiss nichtmehr genau woher das war.
aba da steht FILE *datei;
also der zeiger für die datei. da is der datentyp FILE.kannst ud mir ein c buch empfehlen. ich bestells mir heute noch
