[C] Lecture d'un string à plusieurs mots

Fermé
scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 - 28 déc. 2008 à 02:22
scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 - 28 déc. 2008 à 11:30
Bonsoir vous tous,

Voilà j'aimerais savoir comment faire pour lire plusieurs mots que l'utilisateur entrerais (en mode console) car si je fait ceci :

char prenom[100];

printf("Comment t'appelles-tu ? ");
scanf("%s", prenom);
printf("Bonjour %s, soit le bienvenue !", prenom);


Dès que j'entre plus d'un mot (par exemple : "John Smith"), il retiendra ce que j'ai entré jusqu'au premier espace.

Comment pallier à ce petit problème?

Merci d'avance.

5 réponses

Je ne suis pas du tout un spécialiste du mode console, mais un truc comme ça doit marcher.
#include <stdio.h>
using namespace std;


int main(int argc, char *argv[])
{
  char prenom[100], nom[100];

  printf("Comment t'appelles-tu ? ");
  scanf("%s%s", prenom, nom);
  printf("Bonjour %s %s, soit le bienvenu !\n", prenom, nom);
  return (0);
}

Sinon, on peut utiliser getchar en gérant une boucle jusqu'à attendre le caractère de fin; c'est une solution plus sécurisée que scanf qui fait n'importe quoi si on saisi trop de caractères.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
28 déc. 2008 à 08:11
Salut,
lami20j@debian:~/trash$ cat ccm21_prenom.c
#include<stdio.h>

int main()
{
        char prenom[100];
        char *p=prenom;

        printf("Comment t'appelles-tu ? ");
        fgets(prenom,100,stdin);
        while(*p != '\n' && p++);
        *p='\0';
        printf("Bonjour %s, soit le bienvenue !\n", prenom);

        return 0;
}
lami20j@debian:~/trash$ gcc ccm21_prenom.c
lami20j@debian:~/trash$ ./a.out
Comment t'appelles-tu ? John Smith
Bonjour John Smith, soit le bienvenue !
lami20j@debian:~/trash$ ./a.out
Comment t'appelles-tu ? Titi Toto Tata
Bonjour Titi Toto Tata, soit le bienvenue !
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
28 déc. 2008 à 08:20
Re,

Avec getchar()
lami20j@debian:~/trash$ cat ccm21_prenom.c
#include<stdio.h>

int main()
{
        char prenom[100];
        char *p=prenom;
        int i=0;

        printf("Comment t'appelles-tu ? ");
        while(++i<100 && (*p = getchar())!='\n'&& p++);
        *p='\0';
        printf("Bonjour %s, soit le bienvenue !\n", prenom);

        return 0;
}
lami20j@debian:~/trash$ gcc ccm21_prenom.c
lami20j@debian:~/trash$ ./a.out
Comment t'appelles-tu ? John Smith
Bonjour John Smith, soit le bienvenue !
lami20j@debian:~/trash$ ./a.out
Comment t'appelles-tu ? Titi Toto Tata
Bonjour Titi Toto Tata, soit le bienvenue !
0
scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 425
28 déc. 2008 à 10:39
Un tout grand merci :)

Seulement après avoir regardé cette solution, je trouve que sur cet exemple on n'a pas besoin du pointeur *p non? (je me gourre peut-être totalement).

En tout cas moi j'ai refait ceci de cette manière :
- plus besoin du pointeur *p, autant de servir du i pour indicer notre position dans le tableau vut qu'il est de toute façon là non?
- du coups on n'a plus que deux conditions dans le while au lieu de 3 précédemment (plus besoin d'augmenter l'adresse du pointeur p).
int main(int argc, char *argv[])
{
    int i = 0;
    char prenom[100];

    printf("Comment t'appelles-tu ? ");
    while (i < 100 && (prenom[i++] = getchar()) != '\n');
    prenom[i-1] = '\0';

    printf("\nBonjour %s, soit le bienvenue.\n", prenom);
    return 0;
}


Peut-tu me confirmer et m'expliquer si c'est aussi bon, moins bon, ou mieux?
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 569
28 déc. 2008 à 11:03
Salut,

Effectivement si tu utilises les indices tu n'as pas besoin de pointeurs ;-)

- du coups on n'a plus que deux conditions dans le while au lieu de 3 précédemment (plus besoin d'augmenter l'adresse du pointeur p).
En fait tu viens de le dire.
L'incrémentation de pointeur n'est pas une condition ;-)
Si les deux conditions sont vérifiées et sont vraies alors j'incrémente le pointeur directement dans while pour avoir un code plus compact ;-)

De toute façon il y a toujours plusieurs possibilités de le faire ;-)
Voici encore une avec pointeurs
#include<stdio.h>

int main()
{
        char prenom[100];
        int i=0;

        printf("Comment t'appelles-tu ? ");
        while(i<99 && (*(prenom+i++) = getchar())!='\n');
        *(prenom+i-1)='\0';
        printf("Bonjour %s, soit le bienvenue !\n", prenom);
        return 0;
}

Si tu peux écrire (i+1) < 100 alors tu peux écrire i < 99 ;-)))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
scriptiz Messages postés 1424 Date d'inscription dimanche 21 décembre 2008 Statut Membre Dernière intervention 14 septembre 2023 425
28 déc. 2008 à 11:30
Merci à tous pour votre aide !!! Je commence à bien aimer ce langage =)

Bel exemple mais trop tordu pour moi ton dernier lami20j, je vais maintenant voir parmis les autres lequel je vais utiliser vu qu'il y en a tout plein :-p




PS : Pour le 99 oui j'y avais pensé mais je préférais gardé 100 pour comprendre que ça se rapporte à la taille du tableau ;-)
(comme si c'était une variable en fait bien qu'on m'ai dit de ne pas utiliser de variable pour initialiser la taille de mon tableau :-( )
0