2011-11-08 5 views
7

Voglio spezzare una frase e memorizzare ogni stringa in una matrice. Ecco il mio codice:Rompere la stringa e archiviarla nell'array

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

int main(void) 
{ 
    int i = 0; 
    char* strArray[40]; 
    char* writablestring= "The C Programming Language"; 
    char *token = strtok(writablestring, " "); 


    while(token != NULL) 
    { 
     strcpy(strArray[i], token); 
     printf("[%s]\n", token); 
     token = strtok(NULL, " "); 
     i++; 
    } 
    return 0; 
} 

Continua a darmi errore di segmentazione e non riesco a capirlo. Credo che abbia qualcosa da fare quando copio il token sul mio array.

risposta

12

È perché writablestring non è affatto scrivibile. Il tentativo di scrivere su una stringa letterale è un comportamento non definito e strtok scrive su di esso (è corretto, strtok modifica l'argomento).

Per farlo funzionare, provare:

char writablestring[] = "The C Programming Language"; 

C'è anche un C FAQ.

Un altro problema è che non è stata allocata memoria per l'array di puntatori di caratteri (quindi quei puntatori non indicano nulla).

char* strArray[40]; /* Array of 40 char pointers, pointing to nothing. */ 

Forse provarlo?

/* Careful, strdup is nonstandard. */ 
strArray[i] = strdup(token); 

/* Or this. */ 
strArray[i] = malloc(strlen(token) + 1); 
strcpy(strArray[i], token); 
+0

Yeap, ha fatto il trucco! Grazie! –

+0

+1: Mi hai battuto su di esso –

1

Dai un'occhiata alla the example in the docs:

char * strtok (char * str, const char * delimiters); 

... dove ...

str - stringa C a troncare. I contenuti di questa stringa vengono modificati e suddivisi in stringhe più piccole (token). In alternativa, è possibile specificare un puntatore nullo, nel qual caso la funzione continua la scansione in cui è terminata una precedente chiamata riuscita alla funzione.

delimitatori - stringa C contenente i delimitatori. Questi possono variare da una chiamata all'altra.

Valore restituito - Un puntatore all'ultimo token trovato nella stringa. Un puntatore nullo viene restituito se non ci sono ancora token da recuperare.

È necessaria la prima stringa modificabile e occorre allocare memoria per le uscite, ad es.

int main(void) 
{ 
    int i = 0; 
    const int numOfStrings = 128; 
    char* strArray[numOfStrings]; 
    char writablestring[]= "The C Programming Language"; 
    char *token = strtok(writablestring, " "); 

    for(int j = 0; j < numOfStrings; j++) 
    { 
     strArray[j] = new char[40]; 
    } 

    while(token != NULL) 
    { 
     strcpy(strArray[i], token); 
     printf("[%s]\n", token); 
     token = strtok(NULL, " "); 
     i++; 
    } 
    return 0; 
} 
Problemi correlati