strncat() - Denkfehler

Dieses Thema im Forum "C/C++" wurde erstellt von keytoaster, 05.12.2006.

  1. #1 keytoaster, 05.12.2006
    keytoaster

    keytoaster Jungspund

    Dabei seit:
    21.10.2006
    Beiträge:
    21
    Zustimmungen:
    0
    Ort:
    Hamm
    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
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. hwj

    hwj Doppel-As

    Dabei seit:
    23.06.2006
    Beiträge:
    131
    Zustimmungen:
    0
    Ort:
    Bei Buxtehude
    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
     
Thema:

strncat() - Denkfehler

Die Seite wird geladen...

strncat() - Denkfehler - Ähnliche Themen

  1. Denkfehler, oder was? iptables Script-Problem

    Denkfehler, oder was? iptables Script-Problem: Hi Leute, Ich möchte gern einen Rechner mit ner Firewall schützen. Ich selbst möchte aber alle Port nach aussen offen haben. Führe ich das...
  2. Denkfehler bei PHP / regexp?

    Denkfehler bei PHP / regexp?: Moin Moin! Ich habe ein Problem, an dem ich nun schon seit 2 Tagen sitze und ich langsam kein Land mehr sehe... :-( Ich habe einen 130k...
  3. Denkfehler beim Edit system

    Denkfehler beim Edit system: Das mit dem editen is ja alles ganz schön für die DB und so... aber im grunde ist da ein dnekfehler drin ... Wenn man im Forum einen eintrag...
  4. Kubuntu 6.06 - Denkfehler wegen Installieren?

    Kubuntu 6.06 - Denkfehler wegen Installieren?: Hallo Leute, vieleicht ist das jetzt die dämlichste Frage - aber ich kann es mir nicht erklären! Gibt es beim neuen Kubuntu 2 CD's? Also...
  5. Wo ist der Denkfehler - IF-Abfragen

    Wo ist der Denkfehler - IF-Abfragen: Hallo folgendes Skript is gegeben: ---------- #/bin/sh abfrage=$(ps -A | grep -o "[m]ysqld" | head -n1) read -p "MySql Daten in...