Obtenir un texte de plusieurs lignes, en C |
Bienvenue invité ( Connexion | Inscription )
Obtenir un texte de plusieurs lignes, en C |
11 Aug 2004, 15:14
Message
#1
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 1 599 Inscrit : 20 Sep 2003 Membre no 9 702 |
Bonjour,
j'ai un petit problème de C. Je veux que l'utilisateur puisse entrer un texte sur plusieurs lignes. J'ai donc écrit le code suivant: CODE #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char *text = (char *)malloc(50); long size = 0; int finished = 0; printf("Donnez votre texte. Vous avez droit a 50 characteres.\n"); printf("Pour terminer la saisie, tappez un point \".\" seul sur une ligne:\n"); while(!finished) { fgets(text + size, 50 - size, stdin); if(strrchr(text + size, '\n') == NULL) printf("Votre chaine est trop longue!\n"); else { if(strncmp(".", text + size, 1) == NULL) finished = 1; else size += strlen(text); } } printf("\nMerci pour votre texte! Vous pouvez le verifier:\n"); printf("%s\n", text); free(text); return 0; } En gros, je veux que l'utilisateur entre plusieurs lignes de texte, et quand il a fini, il indique que c'est la fin en entrant un point "." tout seul sur une ligne. Le problème c'est que ça marche tant que l'utilisateur ne dépasse pas la limite des 50 charactères. Mais quand ça dépasse, ça buggue. Est-ce que vous voyez pourquoi? Merci d'avance, -- Arthur; -------------------- |
|
|
11 Aug 2004, 15:42
Message
#2
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 806 Inscrit : 13 Nov 2002 Lieu : Montrouge Membre no 4 646 |
C'est normal, puisque fgets place ça directement dans ton char * texte. si tu dépasse 50 caractères, tu vas dépasser le buffer alloué, et... problème
Moi, j'aurais fait ça caractère par caractère : CODE for (;;) { fgets (text+size, 1, stdin); size++; if (size>49 || strncmp(".", text + size, 1) == NULL) { break; } } Comme ça, vite fait... Ce message a été modifié par FB - 11 Aug 2004, 15:43. -------------------- Very funny Scotty, now beam down my clothes !
Apple : MacBook, iPhone - Nikon : D7000 et quelques cailloux iSort V3.033 - Tarots V1.2 - Judo V2.1 -> iPhoneCode |
|
|
11 Aug 2004, 16:14
Message
#3
|
|
Moderating Daemon Groupe : Modérateurs Messages : 6 345 Inscrit : 22 Feb 2004 Lieu : Yvelines/Cambridge (GB), dans mon pantalon Membre no 15 207 |
Bein non, tout le but de fgets c'est qu'il lit au plus le nombre de caractères que tu lui demandes. Et lire les caractères 1 a 1 c'est horriblement inefficace. (d'autant que si tu passe 1 à fgets ça merde parce que il lit un caractere de moins que ce que tu lui demandes, et lire 0 octets c'est pas bon puisque tu finira jamais).
L'erreur est ici: size += strlen(text); devrait être size += strlen(text+size); tres vite tu avas avoir size>=49, donc un fgets avec en parametre un nombre <=1 (ce qui n'a pas de sens puisque fgets lis 1 de moins que le nombre passé en parametre, l'octet en plus est pour le \0) Ce message a été modifié par f_cam - 11 Aug 2004, 16:15. -------------------- G5 Bi 2GHz rev A, ATI X800 XT
Alu 17" rev A MacBook core duo 1.83 GHz |
|
|
11 Aug 2004, 16:25
Message
#4
|
|
Macbidouilleur d'argent ! Groupe : Membres Messages : 806 Inscrit : 13 Nov 2002 Lieu : Montrouge Membre no 4 646 |
QUOTE(f_cam @ 11 Aug 2004, 16:14) Bein non, tout le but de fgets c'est qu'il lit au plus le nombre de caractères que tu lui demandes. Et lire les caractères 1 a 1 c'est horriblement inefficace. (d'autant que si tu passe 1 à fgets ça merde parce que il lit un caractere de moins que ce que tu lui demandes, et lire 0 octets c'est pas bon puisque tu finira jamais). L'erreur est ici: size += strlen(text); devrait être size += strlen(text+size); tres vite tu avas avoir size>=49, donc un fgets avec en parametre un nombre <=1 (ce qui n'a pas de sens puisque fgets lis 1 de moins que le nombre passé en parametre, l'octet en plus est pour le \0) [right][snapback]806561[/snapback][/right] Bon, ben j'avais dit 'vite fait', on dirait que j'ai TROP vite fait -------------------- Very funny Scotty, now beam down my clothes !
Apple : MacBook, iPhone - Nikon : D7000 et quelques cailloux iSort V3.033 - Tarots V1.2 - Judo V2.1 -> iPhoneCode |
|
|
Nous sommes le : 7th June 2024 - 14:48 |