URL: https://www.overclockers.at/coding-stuff/c_falsche_verwendung_von_strncat_ergebnis_verursac_187590/page_1 - zur Vollversion wechseln!
Bin gerade am Verzweifeln, verwöhnt von den annehmlichkeiten von Java, dachte ich nicht, dass ich an so etwas "trivialem" wie Stringverkettung scheitern könnte...
folgende funktion:
Code:/* * AllocateResources() opens the files to read from * * Arguments: filename1, filename2 - the files to open */ void AllocateResources(const char *filename1, const char *filename2) { char *emsg; /* open first file */ if ((file1 = fopen(filename1, "r")) == NULL) { emsg = strncpy(emsg, filename1, PATH_MAX); emsg = strncat(emsg, " existiert nicht!", 17); emsg = strncat("File ", emsg, (PATH_MAX + 17)); BailOut(emsg); } /* open second file */ if ((file2 = fopen(filename2, "r")) == NULL) { emsg = strncpy(emsg, filename2, PATH_MAX); emsg = strncat(emsg, " existiert nicht!", 17); emsg = strncat("File ", emsg, (PAH_MAX + 17)); printf("%s\n", emsg); BailOut(emsg); } }
da fehlt ein T im PAH_MAX
Reiner Zufall, wenn das irgendwann funktioniert ... du schreibst über einen uninitialisierten Pointer an eine zufällige Speicheradresse.
Normalerweise macht man das ca. so:
Code:char emsg[MAX_MSG_LEN]; snprintf(emsg, sizeof(emsg), "file %s existiert nicht", filename); ...
*autsch*
Nicht initialisierter Pointer tut natürlich weh...
Muss zugeben ich bin was Pointer betrifft noch ziemlich unsicher, vor allem bei der Argumentübergabe und so. Beim Ausmerzen der Compilerfehler hab ich die Initialisierung dann ganz weg lassen, weil ich eine Meldung falsch interpretiert hab.
Also doch ein Newbiefehler
Danke that!
PS: snprintf ist geil, genau das hab ich gebraucht, kann ich den strncat crap rausschmeißen.
Hast du irgend eine GUTE Dokumentation der Standardlibraries bei der Hand?
manpages sind nicht wirklich hilfreich, wenn man eine gewisse Funktionalität sucht, aber keine Ahnung hat, ob es sowas gibt und wie die Funktion heißt.
Ich hab bisher auf
http://www.cppreference.com/all_c_functions.html
nachgeschlagen, aber da ist snprintf() nicht gelistet.
Am liebsten wäre mir etwas wie die Java API-Doc.
http://www.gnu.org/software/libc/manual/
dachte die stringfunktionen in c allokiern selbstständig den notwendigen speicher für die operation? muss ich wohl falsch in erinnerung gehabt haben... und def. gut zu wissen
es gibt welche die es machen, a la strdup().. im großen und ganzen aber nicht => auf alle fälle in die dokumentation schauen.Zitat von semteXdachte die stringfunktionen in c allokiern selbstständig den notwendigen speicher für die operation? muss ich wohl falsch in erinnerung gehabt haben... und def. gut zu wissen
Weil snprintf soweit ich weiß nicht ANSI C ist ....Zitat von Mr. ZetIch hab bisher auf
http://www.cppreference.com/all_c_functions.html
nachgeschlagen, aber da ist snprintf() nicht gelistet.
Ist in ISO C99 und laut Wikipedia:
ZitatC99
In March 2000, ANSI adopted the ISO/IEC 9899:1999 standard. This standard is commonly referred to as C99, and it is the current standard for C programming language.
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025