strtok in einzelne char arrays schreiben



  • Hallo zusammen ,
    ich bräuchte bei folgendem Problem Hilfe.

    Ich schreibe zurzeit die CMD neu d.h alle funktion versuche ich zu übernehmen und habe das Problem das ich wenn mit gets die zeile einlese sie zwar mit strtok schön aufsplitten kann aber irgendwie nach 7 std Tunnelblick irgendwie verpeilt bin die einzelnen strings die ich mir schön aufsplitte in ein array von strings zu schreiben.

    Wenn ich sowas versuche was mit Integern kein Problem wäre:
    for(i=0;i<=command_count;i++)
    {

    run_list = strtok (NULL," ");
    printf("LAUFTEST \n");
    strncpy(all_commands[i], run_list, sizeof run_thruw_list);
    printf("Thats copied: %s",all_commands);
    }

    dann heult mir natürlich der Compiler rum weil ich ja in diesen Moment versuche am Speicherplatz all_command[i] d.h wo gerade mal 2 Byte platz ist run_thruw_list was ka 20 Byte braucht zu speichern.

    Mit Integern wäre das Kein Problem aber wie mache ich das mit Strings???
    d.h das ich z.b 3 Befehle einlese das er mir die schön in 3 verschiedene variablen speichert.

    Ich bedanke mich im voraus. ( Wahrscheinlich habe ich gerade total den Tunnelblick bin aber auch todmüde xD )



  • Da du nicht angibst wie deine Variablen definiert sind kann dir hier keiner richtig helfen. (Was ist all_commands[i] und run_thruw_list)
    Da sind alle auf Vermutungen angewiesen.

    Mach daraus mal ein minimales Programm dass man compilieren kann/könnte und den Fehler enthält.
    Also mit include, main und deiner Funktion.

    Und eine kurze Beschreibung was du erreichen willst. Nicht wie.



  • Thomas M schrieb:

    dann heult mir natürlich der Compiler rum weil ich ja in diesen Moment versuche am Speicherplatz all_command[i] d.h wo gerade mal 2 Byte platz ist run_thruw_list was ka 20 Byte braucht zu speichern.

    Der Depp sitzt vor dem Monitor, der Compiler erkennt in wenigen Millisekunden, was du in 7 Stunden für Fehler fabriziert hast.

    Thomas M schrieb:

    Mit Integern wäre das Kein Problem aber wie mache ich das mit Strings???

    Indem du dort, wo du jetzt int bzw. int-Arrays definiert hast, ausreichend große char-Arrays definierst.



  • Also dann nochmal zur erklärung:

    Folgende Idee ich lese mit gets Variabeln ein.
    z.b

    dir c:\pfad\blablabla

    oder.

    copy c:\a\test.txt c:\b\test.txt

    Nun damit ich das richtig interpretieren kann
    verwende ich für gets
    char* command;

    Da kann ich einlesen bis mir der Speicher platzt.

    So nachdem ich das eingelesen habe versuche ich die Variable zu splitten
    und zwar damit ich ein array habe z.b
    all_commands[] wo ich pro zeile einen befehl habe:

    z.b
    all_commands[0] =dir;

    So das zur idee.

    Nun wenn ich das aber schön versuche wie mit einem Integer per

    char all_commands[10][200];
    char *run_thruw_list;
    int command_count = 0; // enthält in diesem bereich schon einen sinnvollen wert

    for(i=0;i<=command_count;i++)
    {

    run_thruw_list = strtok (NULL," ");
    strncpy(all_commands, run_thruw_list, sizeof run_thruw_list);
    printf("Result: %s",all_commands);
    }

    hoffe das reicht nun als erklärung.



  • run_thruw_list ist also ein char* . Demnach ergibt sizeof run_thruw_list auch nur die Größe eines Pointers (meist 4 auf 32-Bit-Systemen)

    all_commands ergibt die Anfangsadresse des 2D-Arrays. An der Stelle liegt das Element all_commands[0][0].

    strncpy(all_commands[i], run_thruw_list, 200);
      printf("Result: %s",all_commands[i]);
    

    sollte reichen.
    Aber wenn da wirklich 200 Zeichen kopiert werden, fehlt die '\0' am Ende vom String.

    Auch ergibt ein char* command; keinen Speicher für irgendeine Zeichenfolge. Das ist nur ein Zeiger, den man auch auf sinnvollen Speicher zeigen lassen muss.

    Und der Nachteil von gets ist, dass du wirklich Text einlesen kannst bis der Speicher platz.
    Nimm dafür fgets().



  • DirkB schrieb:

    Auch ergibt ein char* command; keinen Speicher für irgendeine Zeichenfolge. Das ist nur ein Zeiger, den man auch auf sinnvollen Speicher zeigen lassen muss.

    int main ( void )
    {
    	char* command;
    	strcpy ( &command, "wtf" );
    	puts ( &command );
    	return 0;
    }
    

    🤡



  • Da strtok bereits den Eingabestring zerteilt, würde ich mir die Umkopiererei ersparen:

    #include <stdio.h>
    #include <string.h>
    
    int main( void )
    {
        char string[] = "dir /S /A-D c:\\pfad\\blablabla";
        char seps[]   = " \t";
        char *run_thruw_list;
        int i, j;
    
        char* all_commands[10] = {0};
    
        run_thruw_list = strtok( string, seps );
        for (i=0; run_thruw_list != NULL; ++i )
        {
            printf ("run_thruw_list: %s\n",run_thruw_list);
            all_commands[i] = run_thruw_list;
            run_thruw_list = strtok( NULL, seps );
        }
    
        for (j=0; j<i; ++j)
        {
            printf ("all_commands[%i]: %s\n",j,all_commands[j]);
        }
    
        return 0;
    }
    

    viele grüße
    ralph



  • Vielen Dank 🙂


Anmelden zum Antworten