Bonjour,
Je veux saisir une chaine de caractere qui contient des espaces, mais avec scanf, je rencontre des problèmes.
Comment resoudre ce probleme ?
Et merci d'avance
Version imprimable
Bonjour,
Je veux saisir une chaine de caractere qui contient des espaces, mais avec scanf, je rencontre des problèmes.
Comment resoudre ce probleme ?
Et merci d'avance
Salut,
Pour effectuer des saisies, il est vivement conseillé d'utiliser fgets ;)
http://c.developpez.com/faq/c/?page=...EEN_gets_fgets
c'est normal puisque scanf() permet de lire une chaine jusqu'à la rencontre du premier caractère d'espacement (entrer,espace,tabulation...),donc je ne peux que te conseiller d'utiliser un gets sa marche trés bien.
Non, surtout pas gets() mais bien fgets() : Pourquoi faut-il utiliser fgets() et non gets() ?Citation:
Envoyé par ssmario2
Salut,
Entre autres une solution :
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 int fget_line(char *s, const size_t nb, FILE * fd) { int err = 0 , c1; char * c = 0 ; if (s == NULL || nb == 0 || fd == NULL) { err = 2; } else { if( fgets (s, nb, fd) != NULL) { c = strchr (s, '\n'); if (c != NULL ) { *c = '\0'; } else if( c == NULL && ! feof(fd) ) { while ((c1 = fgetc (fd)) != '\n' && c1 != EOF) {} ; err = 1; } } else { err = EOF; } } return err; }
Oui fgets(); est fortement conseillé à la place de scanf(); qui est assez désastreux ;)
Tu peux également en dernier recours utiliser la fonction read() pour faire une lecture du clavier !
Cependant je ne sais pas si c'est la meilleure solution.Code:
1
2
3
4 char buffer[256]; read(0, buffer, sizeof(buffer)); /* 0 = descripteur de fichier stdin */ buffer[strlen(buffer) - 1] = '\0';
..... read :? ...... Moyen moyen.
Ça je m'en doutais!! sinon il n'y aurait pas eu des fonctions comme gets et fgets de developpées! Mais pourquoi est-ce moyen ?Citation:
Envoyé par Shugo78
Code:
1
2
3
4 char buffer[256]; read(0, buffer, sizeof(buffer)); /* 0 = descripteur de fichier stdin */ buffer[strlen(buffer) - 1] = '\0';
Y'a un truc que je comprend pas dans ce code si quelqu'un peut m'éclairer .
aprés un read la chaine n'est pas formaté alors comment ce fait 'il que strlen marche .
Ne seras t'il pas préferable d'écrire
Code:
1
2
3
4 char buffer[256]; int a ; a = read(0, buffer, sizeof(buffer)); /* 0 = descripteur de fichier stdin */ buffer[a-1] = '\0';
Tu as raison je n'avais pas pensé à ça!
Sinon j'ai remarqué quelque chose faisant de read un handicap pour lire une chaine : la fonction ne vide pas la variable buffer automatiquement. Il faut chaque fois passer par unpar exemple pour réinitialiser buffer.Code:bzero(buffer, sizeof(buffer);
C'est pour toutes ces raisons que read est remplacé par beaucoup d'autre fonctions de lecture plus performantes.
Essentiellement parce que read() n'est pas definie par le norme ISO du C. Cette fonction n'est donc pas necessairement presente dans une implementation donnee. Et meme si elle est presente, rien ne garantie que sur deux implementations differentes elle ait le meme prototype ni le meme fonctionnement.Citation:
Envoyé par muad'dib
En outre la fonction read() "classique", tout comme la fonction fread(), est lus orientee lecture d'enregistrements qe lecture de ligne ou de chaine.
Une question sur ce code : read remplit-elle tout le buffer sans laisser de 0, fgets laisse un zéro à la fin ce qui permet de savoir si la lecture de ligne a été complète.Code:
1
2
3 char buffer[256]; read(0, buffer, sizeof(buffer)); /* 0 = descripteur de fichier stdin */ buffer[strlen(buffer) - 1] = '\0';
Je pose la question car buffer[strlen(buffer) - 1] = '\0' est potentiellement dangereux si buffer est complètement plein.
Salut,
Et que se passe-t-il si dans
on saisit plus de caractères que buffer ne peut en contenir ?Code:
1
2 read(0, buffer, sizeof(buffer));
buffer contiendra les sierof(buffer) premier bytes. Les autres restant dans le tampon.Citation:
Envoyé par dj.motte
Déjà, c'est pas standard... Ensuite, qu'est-ce qui va décider de la fin de saisie ?Citation:
Envoyé par muad'dib
bzero() n'est pas standard... memset() l'est... Mais la bonne méthode est :Citation:
Envoyé par muad'dib
comme je me plais à le rappeler dans mon article sur les sockets (read(), recv(), même combat...)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <stdio.h> #include <io.h> int main (void) { char buffer[256]; int n = read (STDIN_FILENO, buffer, sizeof buffer - 1); if (n >= 0) { buffer[n] = 0; printf ("'%s'\n", buffer); } return 0; }
http://emmanuel-delahaye.developpez....eaux.htm#texte
Voila la reponse a ta question :
tu vas bien lire le nombre de caractère que tu as demandé par contre tous ne serons pas dans le buffer !
Sinon pour revenir sur le topic du début , je conseille vivement la fonction fgets!
Et ne surtout pas utiliser des gets !!!!!!!
Ni des scanf ;)