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"):
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
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;
}
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