Question

J'écris un petit programme en C qui lira les entrées de la console. Puis placez-le dans un tableau de caractères. Après cela, je dois diviser le tableau en mots. Je ne sais pas comment faire ça. Jusqu'à présent, j'ai mis l'entrée dans un tableau de caractères. J'ai besoin de savoir s'il existe un moyen de créer une marque basée sur un caractère vierge. Ou toute autre suggestion sur la façon de gérer ce problème. Merci.

exemple:

entrée: il ne s'agit que d'un test

tableau: [t, h, i, s,, i, s,, o, n, l, y,, a, t, e, s, t, null]

Je voudrais obtenir un tableau de chaînes [ceci, c’est, seulement, un test, null]

main() {

    char msg[50], ch;
    int i = 0;

    printf("***Reading words in your input*****\n\n");
    printf("Type something terminated by ENTER button\n");

    while ((ch = getchar()) != '\n')
        msg[i++] = ch;

    msg[i] = '\0';

    i = 0;

    while (msg[i] != '\0')
        putchar(msg[i++]);
    printf("\n");

}
Était-ce utile?

La solution

Oui, utilisez la fonction strtok :

char* token = strtok(msg, " ");
while (token != NULL) {
  printf("%s", token);
  token = strtok(NULL, " ");
}

Autres conseils

Si vous voulez lire tous les mots jusqu'à la fin du fichier (sans vous arrêter à la nouvelle ligne), alors c'est plus simple:

#include <stdio.h>
int main(){
    char b[999];
    while (scanf("%s",b)==1)
        puts(b);
    return 0;
}

La valeur de retour de scanf correspond au nombre de champs analysés avec succès, ou EOF. Les espaces servent à séparer &%;% s " champs, de sorte que vous obtenez les jetons que vous voulez. Bien sûr, si vous lisez d'abord une ligne, vous pouvez toujours utiliser sscanf.

Si vous souhaitez accumuler un tableau de chaînes au lieu de les traiter une par une ("met (b)" ci-dessus), vous devez vous salir les mains avec realloc, malloc, strcpy et Strlen. Les tampons de taille fixe sont quand même désagréables.

C n'a pas de chaînes dans le sens où vous utilisez le mot. C contient des tableaux de caractères.

Si vous voulez un tableau de chaînes ... vous pouvez avoir quelque chose de similaire à un tableau de tableaux de caractères.

Mais chaque tableau a une taille prédéterminée et vous ne pouvez pas ajouter plus de "chaînes". ou les rendre plus long que l'espace disponible. L’autre option (au lieu de tableaux de tableaux de caractères) consiste à utiliser les pointeurs et la mémoire de malloc () et de mes amis (je laisserai la discussion sur les personnages, malloc () et amis pour une autre fois).

Pour définir un tableau de caractères et diviser une phrase par des espaces, procédez comme suit

char array_of_string[10][6]; /* 10 strings of a maximum of 5 characters each, plus the NUL */
char msg[50] = "this is a test";
/* now split the msg and put the words in array_of_string */
int string_num = 0;
int word_size = 0;
int msg_index = 0;

while (msg[msg_index] != '\0') {
    if (msg[msg_index] != ' ') {
        /* add the character to the proper place in array_of_string */
        array_of_string[string_num][word_size] = msg[msg_index];
        /* and update word_size for next time through the loop */
        word_size++; /* needs check for reserved word size (5) */
    } else {
        /* a space! */
        /* first, terminate the current word */
        array_of_string[string_num][word_size] = '\0';
        /* prepare to start the next word */
        string_num++; /* needs check for reserved number of "strings" (10) */
        word_size = 0;
    }
}
/* array_of_string[0] is now "this"
 * array_of_string[1] is now "is"
 * ...
 */
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top