2013-02-08 2 views
0

Juste pour le plaisir, j'écris un programme qui prendra une chaîne entrée par l'utilisateur (ou peut-être même un document texte) et brouiller les mots dans la chaîne.Cleaner Mise en œuvre de strtok

J'essaie d'utiliser la fonction strtok pour séparer chaque mot de la chaîne. En ce moment, je me sens comme ma mise en œuvre actuelle de strtok est bâclée:

int main(int argc, char *argv[]) 
{ 
    char *string, *word; 

    if(!(string = getstr()))  //function I wrote to retrieve a string 
    { 
     fputs("Error.\n", stderr); 
     exit(1); 
    } 
    char array[strlen(string) + 1];  //declare an array sized to the length of the string 
    strcpy(array, string);   //copy the string into the array 
    free(string); 
    if(word = strtok(array, " ")) 
    { 
     //later I'll just write each word into a matrix, not important right now. 
     while(word = strtok(NULL, " ")) 
     { 
     //later I'll just write each word into a matrix, not important right now. 
     } 
    } 
    return 0; 
} 

Je me sens comme il doit y avoir un moyen plus propre de la mise en œuvre strtok sans déclarer un tableau à mi-chemin à travers le programme. Cela ne me semble pas correct. Est-ce que l'utilisation du strtok est la bonne façon de procéder? Je préfère ne pas utiliser un tableau de taille fixe, comme j'aime tout être dynamique, c'est pourquoi je commence à douter en utilisant strtok est la bonne façon de procéder.

+0

'free (string);' Pourquoi? Je ne vois pas de 'malloc', est-ce que' getstr() 'alloue dynamiquement de la mémoire? –

+1

'char array [strlen (chaîne)];' doit être 'array array [strlen (chaîne) + 1];' –

+0

@AlokSave 'getstr()' alloue de la mémoire dynamiquement. @PaulR Je viens de le mettre à jour, merci. –

Répondre

2

Si votre chaîne est malloced comme suggéré par votre libre. Ensuite, vous n'avez pas besoin de le copier dans un nouveau tampon (qui est btw 1 caractère trop court). Utilisez le tampon qui vous a été fourni.

Il vous suffit de le dupliquer s'il vous a été fourni par un const char *, c'est-à-dire que vous n'êtes pas autorisé à modifier le contenu du tampon.

Il est également préférable d'utiliser strtok_r car le strtok normal n'est pas réentrant.

+0

Oups quel oubli par moi. Wow merci. –

+0

"Il est également préférable d'utiliser strtok_r car les strtokis réguliers ne sont pas réentrants." +1 pour ce commentaire. Je me demandais si l'OP voulait implanter le «vrai» strtok avec toutes ses verrues (principalement non réentrantes), ou si l'OP voulait mettre en place un meilleur strtok. –

0

Vous pouvez utiliser scanf() au lieu de getstr() et strtok()

char word[100]; 
while(scanf(" %s",word)!=EOF) { 
    // use the word string here 
} 

l'utilisateur doit arrêter chracters d'entrée avec

  • EOF = CTRL + D (pour Linux)

  • EOF = CTRL +Z (pour Windows)

+0

Désolé édité ma question pour être plus clair, j'essaie de le faire dynamiquement, je ne cherche pas à utiliser 'scanf'. –