[C] Lecture d'un string à plusieurs mots
scriptiz
Messages postés
1424
Date d'inscription
Statut
Membre
Dernière intervention
-
scriptiz Messages postés 1424 Date d'inscription Statut Membre Dernière intervention -
scriptiz Messages postés 1424 Date d'inscription Statut Membre Dernière intervention -
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 :
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.
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.
A voir également:
- [C] Lecture d'un string à plusieurs mots
- Confirmation de lecture whatsapp - Guide
- Télécharger livre de lecture ce2 gratuit pdf - Télécharger - Éducatifs
- Accusé de lecture gmail - Guide
- Lecture gratuite - Télécharger - Vie quotidienne
- Mettre un mot de passe sur un dossier - Guide
5 réponses
Je ne suis pas du tout un spécialiste du mode console, mais un truc comme ça doit marcher.
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.
#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.
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 !
Re,
Avec getchar()
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 !
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).
Peut-tu me confirmer et m'expliquer si c'est aussi bon, moins bon, ou mieux?
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?
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
Si tu peux écrire (i+1) < 100 alors tu peux écrire i < 99 ;-)))
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 ;-)))
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 :-( )
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 :-( )