Recuperer une chaine avec scanf
Résolu
Benjamin
-
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
fiddy Messages postés 11069 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
Je dois recuperer une suite de chaines avec scanf (je ne peux pas utiliser getchar).
Seulement j aimerais que la saisie s arrete une fois que l utilisateur ne rentre plus rien (Et oui tout simplement =)
Seulement je n arrive pas a indiquer les bonnes conditions dans ma boucle.
j ai essayer while (chaine != EOF) mais sans resultat.
Quelqu un pourrait il m aider ?
merci a tous
Je dois recuperer une suite de chaines avec scanf (je ne peux pas utiliser getchar).
Seulement j aimerais que la saisie s arrete une fois que l utilisateur ne rentre plus rien (Et oui tout simplement =)
Seulement je n arrive pas a indiquer les bonnes conditions dans ma boucle.
j ai essayer while (chaine != EOF) mais sans resultat.
Quelqu un pourrait il m aider ?
merci a tous
A voir également:
- Recuperer une chaine avec scanf
- Recuperer message whatsapp supprimé - Guide
- Comment recuperer une video sur youtube - Guide
- Chaine tnt gratuite sur mobile - Guide
- Récupérer mon compte facebook désactivé - Guide
- Comment récupérer un compte facebook piraté - Guide
15 réponses
Voici une solution, il faudra bien sûr remplacer les printf par ce que tu veux...
La confiance n'exclut pas le contrôle
#include "stdio.h" #include "stdlib.h" int main(void) { char texte[BUFSIZ]; char c; int i; while (1) { for (i=0, c=' '; c!='\n' && i<BUFSIZ-1; i++) { scanf("%c",&c); texte[i]=c; } texte[i-1]='\0'; if (texte[0]=='\0') { break; } else { printf("ECHO -> %s\n",texte); } } printf("STOP"); return 0; }
La confiance n'exclut pas le contrôle
Pourquoi tu ne peux pas utiliser getch() ?
C'est pourtant la meilleure solution !
Si tu ne peux vraiment pas utiliser getch(), et que tu es obligé d'utiliser scanf(), alors c'est tout simplement impossible.
Si tu peux utiliser une autre fonction (autre que scanf et getch), il y a un moyen pour récupérer des chaînes entières, avec des espaces. Et dans ce cas-là, les chaînes vides sont autorisées, et tu pourras effectuer cela.
Attend, je cherche un peu cette fonction, fais-le aussi de ton côté, ce sont des mots-clés du genre "get line", "cin line", "scanf avec espace", etc;
C'est pourtant la meilleure solution !
Si tu ne peux vraiment pas utiliser getch(), et que tu es obligé d'utiliser scanf(), alors c'est tout simplement impossible.
Si tu peux utiliser une autre fonction (autre que scanf et getch), il y a un moyen pour récupérer des chaînes entières, avec des espaces. Et dans ce cas-là, les chaînes vides sont autorisées, et tu pourras effectuer cela.
Attend, je cherche un peu cette fonction, fais-le aussi de ton côté, ce sont des mots-clés du genre "get line", "cin line", "scanf avec espace", etc;
Salut!
Ben écoute, tu fais une condition si la chaine que l'utilisateur à rentré est vide tu sort et tu continues l'exécution de ton programme, point barre. Genre while (chaine != NULL)... Je vois pas trop ou est le problème?
Sinon, tu lui demande avant qu'il ne commence la saisie combien de valeur il va rentrer, comme sa tu fais une boucle en fonction du nombre de valeur qu'il t'as indiqué qu'il veux rentrer genre while(i=0; i<nbVal-1; i++).
Amicalement,
VieTgOOx.
Ben écoute, tu fais une condition si la chaine que l'utilisateur à rentré est vide tu sort et tu continues l'exécution de ton programme, point barre. Genre while (chaine != NULL)... Je vois pas trop ou est le problème?
Sinon, tu lui demande avant qu'il ne commence la saisie combien de valeur il va rentrer, comme sa tu fais une boucle en fonction du nombre de valeur qu'il t'as indiqué qu'il veux rentrer genre while(i=0; i<nbVal-1; i++).
Amicalement,
VieTgOOx.
Je ne peux pas utilise getchar puisque cest une condition de l enonce.
Cest d ailleurs bien dommage =)
Je te rappelle que l utilisateur appuie sur entree apres chaque nom rentre.
Il ne s agit pas vraiment d espaces, si ?
Cest d ailleurs bien dommage =)
Je te rappelle que l utilisateur appuie sur entree apres chaque nom rentre.
Il ne s agit pas vraiment d espaces, si ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Voilà, j'ai trouvé ! C'était un de mes premiers posts :
https://forums.commentcamarche.net/forum/affich-15369031-c-ecrire-string-dans-fichier
Lis un peu, la moitié du post parle de la conversion de string en chaîne.
En utilisant string phrase; getline(cin, phrase); tu^pourras récupérer des chaînes vides.
Je cherche encore un peu le code complet, et je te le passe.
Le lien le plus utile est :
http://www.cplusplus.com/reference/string/string/c_str/
Tu me demandes pourquoi on parle d'espaces ? C'est simple :
Scanf() est incapable de recevoir des chaînes vides. Puisque je sais qu'il existe une autre fonction qui en est capable, je te la donne (getline). Mais celle-ci n'accepte que les strings... ALors, on cherche à convertir le string (vide ou non) en chaîne (vide ou non) afin de comparer.
;)
https://forums.commentcamarche.net/forum/affich-15369031-c-ecrire-string-dans-fichier
Lis un peu, la moitié du post parle de la conversion de string en chaîne.
En utilisant string phrase; getline(cin, phrase); tu^pourras récupérer des chaînes vides.
Je cherche encore un peu le code complet, et je te le passe.
Le lien le plus utile est :
http://www.cplusplus.com/reference/string/string/c_str/
Tu me demandes pourquoi on parle d'espaces ? C'est simple :
Scanf() est incapable de recevoir des chaînes vides. Puisque je sais qu'il existe une autre fonction qui en est capable, je te la donne (getline). Mais celle-ci n'accepte que les strings... ALors, on cherche à convertir le string (vide ou non) en chaîne (vide ou non) afin de comparer.
;)
Excuse moi,je me suis mal exprime.
l utilisateur doit rentre une suite de chaine, qui sont en fait des noms.
Il rentre par exemple DELL, il appuie sur entree. puis APPLE etc..
Je voudrais arreter la saisie lorsque l utilisateur n appuie que sur entree, ce qui signifierait "je n ai plus de noms a mettre".
Mon soucis est que la saisie ne s arrete jamais.
Merci beaucoup pour ta reponse
l utilisateur doit rentre une suite de chaine, qui sont en fait des noms.
Il rentre par exemple DELL, il appuie sur entree. puis APPLE etc..
Je voudrais arreter la saisie lorsque l utilisateur n appuie que sur entree, ce qui signifierait "je n ai plus de noms a mettre".
Mon soucis est que la saisie ne s arrete jamais.
Merci beaucoup pour ta reponse
Vietgoox cest exactement ma question seulement j ai essayer while (chaine != EOF) mais sans resultat...
Je suis en train d'écrire le code qui permettra de faire ce que tu veux. Après, je regarderai la compatibilité. Mais il faudra inlure iostream, même si c'est un projet C...
Voila !
Il y a juste un problème :
Cela dépend de ton IDE. J'ai essayé de compiler en C avec Dev-Cpp, il m'a dit qu'il ne trouvait pas cette librairie. Essaye avec ton IDE. En attendant je cherche (encore) une solution.
Petite chose à noter : j'ai utilisé sprintf(); Certains râleront que je l'aie utilisé, mais alors qu'ils m'expliquent parce que je n'ai jamais trouvé pourquoi c'était déconseillé. Tant que ca fonctionne.
Dis-moi quoi :)
Il y a juste un problème :
Cela dépend de ton IDE. J'ai essayé de compiler en C avec Dev-Cpp, il m'a dit qu'il ne trouvait pas cette librairie. Essaye avec ton IDE. En attendant je cherche (encore) une solution.
Petite chose à noter : j'ai utilisé sprintf(); Certains râleront que je l'aie utilisé, mais alors qu'ils m'expliquent parce que je n'ai jamais trouvé pourquoi c'était déconseillé. Tant que ca fonctionne.
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <cstring> #include <string> using namespace std; int main(){ char *cstr, *p; string phrase; // C'est ta phrase ! Vide ou non char chaine_entree [30] = ""; // Ce sera ta chaîne int already_started = 0; // Sert à savoir si on doit insérer un espace ou non (pas important pour toi) printf("Entrez une phrase, avec espaces ou non, vide ou pas : "); getline(cin, phrase); // On demande à l'utilisateur d'entrer quelque chose ou rien // Conversion de string en chaîne cstr = new char [phrase.size()+1]; strcpy(cstr, phrase.c_str()); p=strtok(cstr," "); while(p!=NULL){ if(already_started){ sprintf(chaine_entree, "%s %s", chaine_entree, p); } else{ sprintf(chaine_entree, "%s", p); } p=strtok(NULL," "); already_started = 1; } delete[] cstr; // Fin de traitement printf("\nLa chaine finale est : %s\n\n", chaine_entree); if(strcmp(chaine_entree, "")){ // La chaîne n'est pas vide printf("La chaine n'est pas vide !\n\n"); } else{ printf("La chaine est vide !\n\n"); } system("pause"); return 0; }
Dis-moi quoi :)
Bonjour,
Lorsque l'utilisateur appuie sur la touche entrée cela est converti en \n. Pourquoi ne pas utiliser cette condition là ?
En gros, tu arrêtes la boucle dès que la chaîne est égale à "\n" ou si le premier caractère est '\n' ?
Google is your friend
Lorsque l'utilisateur appuie sur la touche entrée cela est converti en \n. Pourquoi ne pas utiliser cette condition là ?
En gros, tu arrêtes la boucle dès que la chaîne est égale à "\n" ou si le premier caractère est '\n' ?
Google is your friend
Certes, mais bon ça fait un peu bricole avec le %c.
Moi je verrai plutôt un truc du genre :
Bien sûr, c'est à améliorer.
Cdlt,
Moi je verrai plutôt un truc du genre :
#include <stdio.h> int main(void){ int i=0,j; char texte[10][10]; while(scanf("%[^\n]",texte[i])==1) { scanf("%*c"); i++; } scanf("%*c"); for(j=0;j<i;j++) printf("texte[%d]=%s\n",j,texte[j]); return 0; }
Bien sûr, c'est à améliorer.
Cdlt,