0 votes

Comment procéder pour lire une chaîne de caractères et la mettre en forme en C ?

Comment puis-je lire une chaîne de caractères à partir de stdin et la formater comme telle sur stdout ?

Par exemple : Si je reçois le nom d'une personne : John Doe 03 17

Je veux créer un nom d'utilisateur pour lui comme tel : jd0317

Bien que cela puisse changer pour quelqu'un qui a un deuxième prénom : Jane B. Doe 05 18

Alors ça le serait : jbd0518

Je suppose que vous lisez la ligne et que lorsque vous atteignez un espace, vous stockez cette partie du nom dans un tableau et coupez le reste dont vous n'avez pas besoin. Je continuerais à lire jusqu'à ce que CTRL^D soit lu depuis stdin, ce qui représenterait le EOF.

Est-ce que je devrais juste utiliser scanf dans une boucle ou getchar ?

2voto

Jonathan Leffler Points 299946

J'utiliserais 'fgets()' pour obtenir une ligne, puis je la traiterais pour créer le nom :

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

int main(void)
{
    char line[512];
    if (fgets(line, sizeof(line), stdin) != 0)
    {
        char  name[16];
        char *dst = name;
        char *end = name + sizeof(name) - 1;
        char *src = line;
        while (*src != '\0')
        {
           char  c;
           while ((c = *src++) != '\0' && isspace(c))
               ;
           if (isalpha(c))
           {
               if (dst < end)
                   *dst++ = tolower(c);
               while ((c = *src++) != '\0' && !isspace(c))
                   ;
           }
           else if (isdigit(c))
           {
               while (dst < end && isdigit(c))
               {
                    *dst++ = c;
                    c = *src++;
               }
           }
        }
        *src = '\0';
        puts(name);
    }
    return 0;
}

L'entrée 'John Doe 03 17' produit 'jd0317' ; l'entrée 'Jane B. Doe 05 18' produit 'jbd0518'.

0voto

Martin Beckett Points 60406

Pour lire les données, utilisez soit fgets() avec stdin ou getchar() dans une boucle - ou voyez si votre bibliothèque possède un getline().

Vous pouvez alors diviser la chaîne résultante avec strtok(), ou si cela semble trop compliqué (ça l'est à première vue), vous pouvez diviser l'entrée vous-même en la lisant avec getchar() - détectez simplement les espaces et copiez les valeurs vous-même.

0voto

codaddict Points 154968

Vous pouvez utiliser fgets dans une boucle jusqu'à ce qu'un NULL soit retourné (ce qui arrive si EOF est atteint).
En l'utilisant, vous pouvez lire une ligne complète de l'entrée dans un tableau de caractères.

Ensuite, vous pouvez analyser la ligne à la recherche d'espaces et chaque fois que vous voyez un espace, vérifiez si le morceau précédent était non numérique ; si oui, copiez son premier caractère dans le résultat. S'il était numérique, copiez ses chiffres dans le résultat en les transformant en caractères.

0voto

Jay Points 8393

Vous pourriez utiliser getchar dans une boucle et utiliser EOF ou newline comme condition de fin de boucle. Au moment où vous lisez un caractère, entrez-le dans un tableau et ignorez les autres caractères jusqu'à un espace, puis stockez le caractère suivant l'espace dans votre tableau et répétez le truc d'ignorer les caractères jusqu'à ce que vous atteigniez l'espace suivant.

Mais, vous devez faire attention aux chiffres car vous semblez vouloir stocker tous les chiffres tels quels. Pour cela, vous pouvez comparer le caractère saisi avec les valeurs ASCII des chiffres entre 1 et 9 pour voir s'il s'agit d'une lettre ou d'un chiffre et stocker tous les chiffres. Vous pouvez faire cela uniquement si le caractère saisi immédiatement après l'espace est un chiffre, car votre question semble suggérer cette exigence.

Il se peut également que vous deviez effectuer des contrôles d'erreurs en fonction de votre fonctionnalité. N'oubliez pas de vérifier les limites du tableau dans lequel vous stockez les données.

Ce n'est que ma suggestion de base. J'espère que cela vous aidera.

0voto

MAK Points 12571

Pour lire une ligne entière, y compris les espaces, vous pouvez utiliser fgets dans une boucle jusqu'à ce qu'un EOF soit rencontré. Ensuite, vous pouvez utiliser soit sscanf o strtok pour accéder aux éléments individuels séparés par des espaces de chaque ligne.

sscanf est généralement le meilleur choix si vous connaissez déjà le nombre de jetons que contient chaque ligne et leurs types. strtok vous permet de récupérer tous les jetons d'une ligne même si vous ne savez pas combien de jetons elle contient.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X