IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> Obtenir un texte de plusieurs lignes, en C
Options
Arty
posté 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;


--------------------
MacBook Pro 15" Core [email protected]
Mac OS 10.9.3
iPhone 5 - 32 Go Black
Go to the top of the page
 
+Quote Post
FB
posté 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 smile.gif

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
Go to the top of the page
 
+Quote Post
f_cam
posté 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
Go to the top of the page
 
+Quote Post
FB
posté 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 wink.gif


--------------------
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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 7th June 2024 - 14:48