strtok() mit mehrdimensionalem Array[gelöst]

Hi,

ich schreibe gerade ein kleines Programm, dass eine Datei lesen soll (Zeile für Zeile) und dann Zahlen, die durch Leerzeichen getrennt sind, zu extrahieren und in ein Array einzutragen. So weit so gut. Mit einem normalen Array funktioniert auch alles wie es soll, doch sobald ich ein mehrdimensionales Array verwende, in dem die Zeile der Datei gespeichert ist, und das ich mit strtok() zerlegen will, funktioniert es nicht, es kommen völlig kryptische Ergebnisse bei raus. Weiß jemand woran das liegen kann?

Hier noch mein Code:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
    FILE *map_datei = fopen("map.txt", "rw");
    char daten[1][80];
    if (map_datei == NULL)
       return -1;
    if(fgets(daten[0], 80, map_datei) == NULL)
    {
        printf("Erste Zeile nicht ermittelt\n");
        return -1;
    }
    printf("daten: %s\n", daten[0]);
    char *zwischen_block;
    char *block[80];
    int i = 0;
    while(i <= 80)
    {
        /* if( ( zwischen_block[i] = (char *)malloc(20) ) == NULL)
        {
            printf("Konnte keinen Speicher fuer Zwischenblock %i allokieren\n", i);
            return -1;
        } */
        if( ( block[i] = (char *)malloc(20) ) == NULL)
        {
            printf("Konnte keinen Speicher fuer Block %i allokieren\n", i);
            return -1;
        }
        i++;
    }
    /* Jetzt den String aus der Zeile zerlegen */
    int block_int = 0;
    zwischen_block = strtok(daten[0], " ");
    while(zwischen_block != NULL)
    {
        printf("block_int: %i\n", block_int);
        block[block_int] = zwischen_block;
        printf("%s\n", block[block_int]);
        zwischen_block = strtok(NULL, " ");
        block_int++;
    }
    return 0;
}
Die Datei, aus der gelesen wird, sieht ungefähr so aus:
0 1 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 0 0 0 (So grob :p)

Danke für Antworten:wink:
 
Zuletzt bearbeitet:
Code:
char *block[80];
...
while(i <= 80)
...
block[i] = (char *)malloc(20)
Ein off-by-one?

Edit: es wundert mich ehrlich gesagt, dass der gcc keine Fehlermeldung wirft.
Zumal der Fehler offenbar nur deshalb "direkt" auffällt, weil "daten" ohne Padding gleich nach dem "block" positioniert werden und man bei der Ausgabe die Überlappung als "kryptische" Zeichen wahrnimmt.
 
Also, vielen Dank erst mal für deine Antwort, aber ähm... sorry, ich versteh dein Problem nicht.. Warum ist da ein off-by-one Fehler drin?

i = 0 und die Schleife geht bis 79, wie gewollt.
Wie kann ich das Problem jetzt konkret beheben und warum taucht der Fehler überhaupt nur auf, wenn man strtok() ein zweidimensionales Arraya übergibt?
 
i = 0 und die Schleife geht bis 79, wie gewollt.

die Schleife geht bis 80, da du den <= Operator anstatt des < Operator in der while-Bedingung verwendest.

EDIT: Du solltest dir übrigens einen sauberen Programmierstil angewöhnen, Variablen sollte man z.B. nicht irgendwo in der Mitte des Programms deklarieren.
 
Zuletzt bearbeitet:
Omg bin ich bescheuert. Warum fällt mir das einfach nicht auf :rolleyes:
Bisschen verpeilt irgendwie, aber nun gut, jetzt hab ich den kleinen Bösewicht ja gefunden, dankeschön :)

EDIT: Zum Programmierstil: Das sind hier alles nur kleine Testprogramme, bin grade an einem Spiel dran, und da ich nicht sehr erfahren bin, gehe ich alle Teilprobleme für sich allein an. Im "richtigen" Projekt lege ich dann natürlich eine andere Gründlichkeit an den Tag ;)
 
Zuletzt bearbeitet:
EDIT: Du solltest dir übrigens einen sauberen Programmierstil angewöhnen, Variablen sollte man z.B. nicht irgendwo in der Mitte des Programms deklarieren.
Um auch hier einen Glaubenskrieg loszutreten: Wo denn dann? Deklariert man Variablen erst da, wo man sie auch benutzt eliminiert man unnütze Lebenszeit und reduziert so die Komplexität (Siehe Code Complete 2, Kapitel 10.4 "Scope").
 
Um auch hier einen Glaubenskrieg loszutreten: Wo denn dann? Deklariert man Variablen erst da, wo man sie auch benutzt eliminiert man unnütze Lebenszeit und reduziert so die Komplexität (Siehe Code Complete 2, Kapitel 10.4 "Scope").
Programmierstil ist grundsätzlich etwas über das man streiten kann und eig. entwickelt im Laufe der Zeit jeder so seinen ganz eigenen Stil.

Was das Deklarieren der Variablen betrifft würde ich das aber immer am Blockbeginn tun, nicht zuletzt wegen der (wie ich finde) besseren Übersicht.
Weiteres muss in (Ansi-)C die Variablendeklaration am Blockanfang geschehen und da C++ die objektorientierte Erweiterung von C ist, liegt es nahe das hier genauso zu tun.

Ansonsten kannst du mir ja noch sagen, welche Variante du am folgenden Beispiel übersichtlicher findest:
Am Anfang deklarieren:
Code:
int main()
{
    int length;   // Länge des Quaders
    int width;    // Breite des Quaders
    int height;   // Höhe des Quaders
    
    cout << "Geben sie die Länge des Quaders ein: ";
    cin  >> length;
    
    cout << "Geben sie die Breite des Quaders ein: ";
    cin  >> width;
    
    cout << "Geben sie die Höhe des Quaders ein: ";
    cin  >> height;
    
    cout << "Das Volumen des Quaders beträgt: " << length * width * heigth;
    
    return 0;
}
Dort deklarieren wo man sie braucht:
Code:
int main()
{
    int length;
    cout << "Geben sie die Länge des Quaders ein: ";
    cin  >> length;
    int width;
    cout << "Geben sie die Breite des Quaders ein: ";
    cin  >> width;
    int height;
    cout << "Geben sie die Höhe des Quaders ein: ";
    cin  >> height;
    cout << "Das Volumen des Quaders beträgt: " << length * width * heigth;
    return 0;
}
 
Zuletzt bearbeitet:
Weiteres muss in (Ansi-)C die Variablendeklaration am Blockanfang geschehen
131769676239s3u81.jpg
 
Zu Variablendeklaraton und Standards:
falls C99 nicht zu bleeding edge ist => erlaubt ;)


Ansonsten bitte Glaubenskriege in einem Extrathread austragen
attachment.php
 
Zurück
Oben