2009-05-26 7 views
1

Ich habe den folgenden Code:Mit strsep() mit dynamischer Array von Strings in C

#include <string.h> 

int main(void) { 
    char *buffer = NULL, **words = NULL, *aPtr = NULL, *sPtr; 
    int count = 0; 

    buffer = strdup("The quick brown fox jumps over the lazy dog"); 
    sPtr = buffer; 

    do { 
     aPtr = strsep(&sPtr, " "); 

     words[count++] = ... // missing code 
    } while(aPtr); 

    return 0; 
} 

Ich vermisse einige Code wie Sie oben sehen können ... Gibt es irgendeine Art von strdup(), die arbeitet an dieser Situation? Die strdup() Funktion selbst scheint nicht zu funktionieren ... Wenn es keine gibt, wie kann ich dieses Stück Code arbeiten lassen?

Pointer der Zeiger ist Kopfschmerzen für mich ...

Antwort

2

Noch haben Sie nicht words[0] zugeordnet, words[1], ... so strdup Verwendung hilft nicht.

Schlechter, Sie wissen nicht im Voraus, wie viele Wörter es sein wird, so ist es nicht trivial zu malloc den Raum, den Sie brauchen.

Eine Option besteht darin, words durch eine verknüpfte Liste oder ein dynamisches Array zu ersetzen.

2

Sie müssen Speicherplatz zuweisen für words Array, so etwas wie:


#define MAX_NUM_WORDS 1024 
... 
/* on the stack */ 
char* words[MAX_NUM_WORDS]; 
... 
/* or on the heap */ 
char** words; 
if ((words = (char**)malloc(MAX_NUM_WORDS * sizeof(char*))) == NULL) 
{ 
    perror("malloc"); 
    exit(1); 
} 

Oder noch besser - nutzen dynamische Datenstruktur wie eine einfach verkettete Liste.

1

Ihr erstes Problem ist, dass Sie eine Liste für Wörter wollen - Sie könnten durch das Festcodieren einiger Grenzen in Wörtern (ein Array von N Wörtern und jedes Wort ist eine Adresse) wegkommen, aber das ist nicht wirklich Produktionsqualität. Die wirkliche Lösung ist, eine Liste zu haben (die intern als wachsendes Array implementiert werden könnte)

Ich sehe das Problem mit strdup nicht, aber Sie sollten strsep void, die Funktion hat keine gute API. Es wäre fast einfacher zu tun, was Strspe von Hand macht.

1

Sie benötigen ein dynamisch zugewiesenes Array. Sie können Ihre eigenen rollen, aber warum nicht Seq_T von Dave Hansons C Interfaces and Implementations verwenden? Die Seq_addhi Funktion wird genau das tun, was Sie wollen.

2

könnten Sie etwas einfach zu verwenden, wenn es nur für den Versuch:

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

#define MAX_WORDS 100 

int main(void) { 
    char *buffer, *words[MAX_WORDS], *aPtr; 
    int count = 0, i; 

    buffer = strdup("The quick brown fox jumps over the lazy dog"); 
    if (!buffer) return 1; 

    do { 
     aPtr = strsep(&buffer, " "); 
     if (aPtr && count < MAX_WORDS) words[count++] = aPtr; 
    } while(aPtr && count < MAX_WORDS); 

    for (i = 0; i < count; i++) { 
     printf("%s\n", words[i]); 
    } 
    return 0; 
} 

es läuft:

[macbook:~] jianlin $ ./a.out 
The 
quick 
brown 
fox 
jumps 
over 
the 
lazy 
dog 
[macbook:~] jianlin $ 
1

die Schleife über ein bisschen ungeschickt war, so habe ich es zu:

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

#define MAX_WORDS 100 

int main(void) { 
    char *buffer, *words[MAX_WORDS], *aPtr; 
    int count = 0, i; 

    buffer = strdup("The quick brown fox jumps over the lazy dog"); 
    if (!buffer) return 1; 

    while((aPtr = strsep(&buffer, " ")) && count < MAX_WORDS) 
     words[count++] = aPtr; 

    for (i = 0; i < count; i++) { 
     printf("%s\n", words[i]); 
    } 
    return 0; 
} 

der Ausgang ist der gleiche.