strncat() - Denkfehler

keytoaster

keytoaster

Jungspund
Hallo,

ich bin seit einigen Tagen dabei C zu lernen. Nun bin ich beim Thema Strings und der Funktion strncat() angelangt. Hier der Beispielcode aus meinem Buch ("C von A bis Z"):

Code:
/* strncat.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 15

int main(void) {
   char string[MAX] = "Hallo ";
   char puffer[20];
   /* Vorhandenen Platz in string ermitteln*/
   size_t len = MAX - strlen(string)+1;

   printf("Ihr Name: ");
   fgets(puffer, 20, stdin);
   strncat(string, puffer, len);
   printf("%s",string);
   return EXIT_SUCCESS;
}
Mein Denkfehler liegt irgendwie in der Zeile size_t len = MAX - strlen(string)+1;.
Und zwar gibt strlen() ja die Länge des Strings ohne abschließendes \0-Zeichen zurück. string belegt nach der ersten Zuweisung ja 6 Zeichen plus \0. strlen(string) würde dann 6 zurückgeben. Da die Funktion strncat() das \0-Zeichen des vorhandenen Strings überschreibt, frage ich mich wozu in der besagten Zeile das "+1" steht. Demnach würde len der Wert MAX - strlen(string) +1, also 15 - 6 + 1, also 10 zugewiesen. Im String selbst (inkl. \0-Zeichen) sind aber nur noch 9 Zeichen (inkl. \0-Zeichen) frei. Somit würde strncat() einen Byte über das Ende des Strings hinausschreiben, da len um 1 zu groß ist.

Liege ich da richtig und handelt es sich wirklich um einen Fehler im Buch? Oder ist es ein ganz mieser Denkfehler meinerseits?

Gruß,
keytoaster
 
Yup, so sehe ich das auch. Wenn Du die Zeile
Code:
char string[MAX] = "Hallo ";
sicherheitshalber auf
Code:
char string[MAX+5] = "Hallo ";
änderst, und dann einen SEHR langen Namen eingibst, ist der String am Ende 16 Zeichen + \0 lang - und somit sogar 2 Zeichen zu kurz bei MAX=15

Heiko
 

Ähnliche Themen

Unix Webserver mit HTML Seite erstellen

Keine grafische Oberfläche (Debian Installation)

Samba 4.1.11 Domänen anbindung funktioniert nicht !!!

Samba 4.1.9 mit Bind 9.9.4

[PHP] Autologin-Funktion

Zurück
Oben