2016-10-10 1 views
2

Je rencontre actuellement des difficultés pour lire les mots séparés par des espaces, ligne par ligne, de stdin. J'essaie de lire les mots ligne par ligne, et je les imprime simplement en accédant à un tableau de chaînes.Array of Strings issue

Si je suis en train de lire cette phrase:

Enter words: Hi there, how was your day sir?

Je veux juste imprimer la phrase en dessous, comme ceci:

Your sentence: Hi there, how was your day sir?

C'est ce que mon code est jusqu'à présent:

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

int 
main(int argc, char *argv[]) { 
    char *word = NULL; 
    char **words = NULL; 
    int word_size = 1, word_len = 0, word_count = 0; 
    int words_size = 1, i, ch; 

    word = (char*)malloc(word_size *sizeof(char)); 

    words = (char **) malloc(words_size*sizeof(char*)); 

    printf("Enter words:\n"); 
    while ((ch = getchar()) != EOF) { 
     if (isalpha(ch)) { 
      word_size++; 
      word = realloc(word, word_size+1); 
      word[word_len++] = ch; 
      word[word_len] = '\0'; 
     } 

     if (isspace(ch)) { 
      words_size++; 
      words = realloc(words, words_size+1); 

      words[word_count] = malloc(strlen(word)+1); 

      words[word_count++] = word; 
      word_len = 0; 
      word_size = 1; 
     } 

     if (ch == '\n') { 

      printf("Your sentence is:\n"); 
      for (i = 0; i < word_count; i++) { 
       printf("%s ", words[i]); 
      } 
      printf("\n"); 

      word_len = 0; 
      word_size = 1; 
      words_size = 1; 
     } 

    } 
    return 0; 
} 

Je ne suis pas sûr pourquoi cela ne fonctionne pas, et pourquoi il imprime le dernier mot. Je sais qu'il y a beaucoup de marketing et de réaffectation, j'essaie juste de mieux les utiliser.

Toute aide serait appréciée

+0

[Ne pas jeter le retour de malloc] (http://stackoverflow.com/questions/605845/do-i-cast-the-result -of-malloc) – Garf365

+1

Vous devriez utiliser 'fgets' pour stocker toute la phrase et ensuite la calculer. – LPs

+0

Ouais @LPs, j'essaie juste de faire la manière brute de la force. Mais ouais 'fgets' rendra cela plus facile. – RoadRunner

Répondre

1

Vous ne parviennent pas attribuer le mot à votre char **.

En utilisant

words[word_count++] = word; 

Vous assignez adresse de mot variable locale pointeur words[word_count] qui vous a donné, à la fin du calcul, tous les mots avec dernier mot stocké dans word c-string.

Vous préparez un espace pour le mot c-chaîne à l'aide

words[word_count] = malloc(strlen(word)+1); 

Donc ce que vous devez faire est de copier le contenu du mot c-string dans l'espace allocaded

strcpy(words[word_count++], word); 

Sinon, vous êtes fuite de mémoire allouée pour le mot.

notes secondaires:

  1. malloc et realloc peuvent échouer, afin de vérifier sa valeur de retour != NULL
  2. Vous devez freemalloc mémoire ATED.Le « salut-niveau » mémoire du système d'exploitation est automatiquement libéré à la fin de l'exécution, mais n'est pas accordée sur toutes les plates-formes/OS

EDIT

Un autre problème est que vous réaffecte la mauvaise taille pour votre char ** Vous utilisez qui devraient

words_size++; 
words = realloc(words, sizeof(*words)*words_size); 

C'est la taille de char * pour le nouveau nombre de mots pour stocker

Vous pouvez également éviter d'utiliser strlen, vous avez la longueur du mot stocké dans word_len variables

words[word_count] = malloc(word_len+1); 

La dernière chose, avant d'enregistrer un nouveau mot que vous devriez vérifier au moins alpha omble a été trouvé. Cela permet d'éviter la sortie de premier espace de votre ombles piqûre d'essai:

if ((isspace(ch)) && (word_size>1)) 
+0

Merci @LPs, définitivement résolu mon problème. J'ai eu beaucoup de problèmes avec ce programme. – RoadRunner

+0

@ De rien. J'ai mis à jour ma réponse avec un autre problème. – LPs

+1

Ouais, merci. Je viens de réaliser à quel point je suis terrible à C, devenant légèrement mieux. THanks pour toute l'aide bien que l'homme :) – RoadRunner