如何在c中处理字符串数组

时间:2018-12-05 05:49:51

标签: c

我编写了一个c程序,该程序通过*input作为参数传递,并且应该充当外壳程序。因此,我需要将输入拆分为我打算在char * tokens中进行操作的字符串数组。但是,例如token + 2似乎没有引用我想要保存在数组第二个位置的整个String。您能帮助我如何进行更改吗?谢谢!

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int parse(char *input)
{   
    char * tokens = (char *) malloc(1024);
    //Zaehler, an welcher aktuellen Stelle im Array tokens das Token ist
    int zaehlertokens=0;
    //zaehler der Stelle im Array input:
    int zaehler=0;
    //Zaehler, welche Stelle im Array input die erste nach einem Leerzeichen war:
    int lastspace=0;
    while(input[zaehler]!='\0')
    {
        //Input durchlaufen und bei Leerzeichen in Elemente aufteilen:
        if(input[zaehler]==' ')
        {
            //Alle Buchstaben seit letzem Leerzeichen als neuen Eintrag in tokens speichern:
            strncpy (tokens+zaehlertokens, input+lastspace, zaehler-lastspace-1);

            zaehlertokens++;
            lastspace=zaehler;
            //damit umgehen, dass mehrere Leerzeichen nacheinander kommen:
            while(input[zaehler]==' ')
            {
                zaehler++;
                lastspace++;
                printf("Leerzeichen. Zaehler: %i, Lastspace: %i\n", zaehler, lastspace);
            }
        }
        //Zeiger auf das naechste Element im input Array
        zaehler++;
    }
    //Wenn \0 aufgetreten ist, muss das letzte Elemente noch als token gespeichert werden:
    if(input[zaehler]=='\0')
    {
        //Alle Buchstaben seit letzem Leerzeichen als neuen Eintrag in tokens speichern:
        strncpy (tokens+zaehlertokens, input+lastspace, zaehler-lastspace-1);
        zaehlertokens++;
        lastspace=zaehler;
    }

    int zaehlerAusgabe=0;
    ///Schleife, die die Befehle nacheinander ausgibt
    printf("Vor Ausgabe. Zaehlertokens: %i\n", zaehlertokens);
    while(zaehlerAusgabe<zaehlertokens)
    {
        //row number:token
        printf("%i: %s\n", zaehlerAusgabe, tokens+zaehlerAusgabe, sizeof(zaehlerAusgabe)+1+sizeof(tokens+zaehlerAusgabe));
        fflush(stdout);
        zaehlerAusgabe++;
        //Ueberpruefen, ob exit eingegeben wurde:
        printf("Comparison with exit, %s\n", tokens+zaehlerAusgabe-2 /*-1?*/);
        if(strcmp(tokens+zaehlerAusgabe-1, "exit")==0)
        {
            printf("exit\n");
            exiteingegeben=1;
        }
    }
    return exiteingegeben;
}

1 个答案:

答案 0 :(得分:1)

对于字符串数组,您需要2D数组。最初,您可以将其分配给已知数量的令牌,如果需要,可以分配realloc

char ** tokens = malloc(noTokens * sizeof(char*));

然后,您需要为每个令牌分配内存。

// Replace below line with
// strncpy (tokens+zaehlertokens, input+lastspace, zaehler-lastspace-1);

tokens[zaehlertokens] = malloc(zaehler + 1);
strncpy (tokens[zaehlertokens], input+lastspace, zaehler-lastspace-1);
tokens[zaehlertokens][zaehler] = '\0';  // null termination

如果最初分配的内存不足,则可以重新分配

if (zaehlertokens >= noTokens)
{
    noTokens *= 2;
    char ** tokens = realloc(noTokens * sizeof(char*));
}