Fehler beim Schreiben in String Arrays in C

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Fuchs
Beiträge: 1
Registriert: Mi Nov 27, 2019 10:38 am

Fehler beim Schreiben in String Arrays in C

Beitrag von Fuchs » Do Dez 05, 2019 6:40 pm

Hallo alle zusammen,

habe vor kurzem angefangen mich mit dem Programmieren in C auseinader zu setzen und habe hier mal versucht ein Programm zu schreiben, welche eine Nachricht (NACHRICHT) in vorgegebene Teilgrößen zerlegt und jerweil in einen String in Teile [][] schreibt. Im Folgenden erstmal der Code:

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define NachrichtAnzl 5 /* Nachrichtenanzahl = Anzahl der Nachrichten -1 */
#define NACHRICHT "+z@97USNULNutz_Datenz2"

int main(void){

    uint32_t i;                                                 /*Zähler äußere Schleife */
    uint32_t j;                                                 /*Zähler innere Schleife */
    uint32_t start[] = {0, 2, 4, 7, 10, 20};                    /* Startpunkte für die äußere Schleife*/
    uint32_t ZeichenAnzl[] = {1, 1, 2, 2, 9, 1};             /* Zeichenanzahl pro Paket */
    uint8_t NachrichtPaket[] = NACHRICHT;                       /* Hier kann auch direkt der String eingetippt werden. Ausgabe gleich. */

    char *ptr;                                                  /*Pointer äußere Schleife. Zum Setzen des Startpunktes der inneren Schleife */
    char *ptr2;                                                 /*Pointer innere Schleife. Zum Durchlaufen der Buchstabenanzahl */

    uint8_t Teile[NachrichtAnzl][10];


/* Äußere Schleife. Setz den Pointer ptr nach jedem Durchlauf an die Stelle des nächsten Nachrichtenanfangs */
    for(i = 0; i <= NachrichtAnzl; i++){

/* ptr wird die Adresse des ersten Elementes zugewiesen und falls i > 0 ist, wird der Pointer um start[i] verschoben*/
    ptr = &NachrichtPaket[0] + start[i];

/* setzte ptr2 an Anfang des aktuellen Nachrichtenpaketes*/
        ptr2 = ptr;

/* innere Schleife durchläuft die Anzahl der aktuellen Nachricht. Vorgegeben durch BuchstabenAnzl */
        for(j = 0; j <= ZeichenAnzl[i]; j++){



            Teile[i][j] = *ptr2;

            ptr2++;



        }

/* schreibe ein \0 ans Ende des Strings */
        Teile[i][ZeichenAnzl[i] + 1] = NULL;



    }

        printf("%s\n", Teile);
        printf("%s\n", Teile[1]);
        printf("%s\n", Teile[2]);
        printf("%s\n", Teile[3]);
        printf("%s\n", Teile[4]);
        printf("%s\n", Teile[5]);
      

    return 0;

}
-----------------------------------------
Aufgabe:

+z
@9
7US
NUL
Nutz_Datenz2
z2
-----------------------------------------

Alles ist soweit auch in Ordnung, bis auf die die Ausgabe mit dem Inhalt "Nutz_Datenz2". Dort sollte eigentlich nur "Nutz_Daten" stehen.
Es scheint zum Problem zu werden, wenn die Zeichenanzahl 10 ist, weil dort "Nutz_Date" steht, wenn ich ZeichenAnzl[4] = 8 setzte statt 9.
Jemand ne Idee? Ich weiß da nicht mehr weiter und es macht mich wahnsinnig.

ps: Es geht dabei nicht darum, dass man das auch einfacher mit strncpy oder Ähnlichem ginge.

Danke schon mal

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8612
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Fehler beim Schreiben in String Arrays in C

Beitrag von Xin » Fr Dez 06, 2019 12:28 am

Dein Teile Array ist pro Eintrag 10 Zeichen lang.
Kopierst Du 10 Zeichen in Eintrag 4, kommt das Nullbyte an Stelle 11. Die gibt es aber nicht. Du überschreibst damit das erste Zeichen von Eintrag 5. Wenn Du anschließend Eintrag 5 mit z2 setzt, überschreibst Du das Nullbyte.
Eintrag 5 gibt es auch nicht.
C zählt von 0 beginnend. Deine Einträge bei Teile sind also von Index 0 bis 4, nicht von 1 bis 5.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten