FORUM Syndrome-OC - Jacky-PC


  Programmation


  Autre


  [C] Chaines de caractères

 




cydoo, bool@y Le salon de discussion : ratur, KneXos, 2 utilisateurs anonymes et 13 utilisateurs inconnus

 Mot :   Pseudo :  
 
 Page :  1  2
Page Précédente 
Auteur Sujet :

[C] Chaines de caractères

n°4526
biboune77
BeYhhhh
Posté le 14-12-2004 à 20:58:20  profilanswer
 

Bonjour,
 
Voila j'ai un TD qui demande la chose suivante :
 
Lire une chaine : "BONJOUR JE SUIS UN HOMME"
Il faut que j'affiche :
 
BONJOUR 7 cartères
JE 2 caractères
...
 
Donc je vois qu'il faut passer la chaine juska l'arrive d'un ESPACE mais pour copier et pour les autres mots je ne vois pas...
 
Merci de votre aide !

mood
Google
Posté le 14-12-2004 à 20:58:20  profilanswer
 

n°4527
nicodache
marmotte en chocolat concept ©
Posté le 14-12-2004 à 21:08:38  profilanswer
 

tssss
 
c'est pourtant d'un basique...
char *p = *chaine[1]; // un truc du genre :D
char **buffer;
 

Code :
  1. while (p != '\n') {
  2.     while (p != ' ') {
  3.         // rajouter p à la fin de buffer
  4.     }
  5.     printf("%s\n", buffer);
  6.     // remettre buffer à ""
  7. }


 
et désolé, j'ai plus fait de C depuis quelque temps...
mais ton truc, c'est une bete question d'algorithmique
 
[edit]ha, faut compter le nombre de caractères ?
bah tu prend un int, que tu met à 0 après le while (p != '\n'), que tu incrémentes dans le while (p != ' '), et puis tu remplaces le printf par printf("%s %i caractères", buffer, i);


Message édité par nicodache le 14-12-2004 à 21:10:30

---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4528
biboune77
BeYhhhh
Posté le 14-12-2004 à 21:12:31  profilanswer
 

LOL merci mais ca me dit pas comment copier la chaine que je viens de lire ?

n°4529
nicodache
marmotte en chocolat concept ©
Posté le 14-12-2004 à 21:15:54  profilanswer
 

ca c'est pas à moi à te l'apprendre :D
 
t'as surement ca dans tes notes de cours, dans la partie traitement des chaines de caractère :D
 
et puis sinon, tu peux aussi splitter la chaine et compter le nombre de lettre après ;)


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4530
biboune77
BeYhhhh
Posté le 14-12-2004 à 21:18:00  profilanswer
 

Euh si je poste c'est que j'ai pas trouvé dans mon cours, et c'est cool d'essayer de m'aider mais dans ton code pour moi il y a des choses qui n eveulent rien dire (char *p = *chaine[1]; ) et pourquoi buffer serait un super pointeur et puis je sais faire 2 whiles lol
 
enfin merci quand mm

n°4531
nicodache
marmotte en chocolat concept ©
Posté le 14-12-2004 à 21:20:58  profilanswer
 

c'est vrai qu'on devrait pouvoir se limiter à un simple char p et un autre simple char *chaine à récuperer après avec un chaine[indice]...


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4532
Deather2
OpenBSD: the way to go!
Posté le 14-12-2004 à 21:23:16  profilanswer
 

Un essai:

Code :
  1. int main(void)                          // Pas besoin d'arguments ici
  2. {
  3.     unsigned int uiWordSize = 0;        // Taille du mot qu'on a compté
  4.     unsigned int uiLastWordSize = 0;    // Taille du mot précédent
  5.    
  6.     char* cpString;                     // String à parser
  7.     cpString = (char*) malloc(512);     // Taille maxi = 511 mots + \0
  8.    
  9.     do
  10.     {
  11.         if(cpString == ' ')             // Si on tombe sur un espace
  12.         {
  13.             // on va afficher le mot, pour ça on part du dernier mot juska celui trouvé
  14.             for(unsigned int i = uiLastWordSize; i < uiWordSize; i++)
  15.             {
  16.                 printf("%c", cpString[i]);
  17.             }
  18.             printf("Nombre de caractères: %i", uiWordSize);
  19.             uiLastWordSize = uiWordSize;
  20.          }
  21.          uiWordSize++;
  22.      } while(cpString[uiWordSize] != '\0');    // Tant qu'on est pas à la fin du string
  23. }


 
Voilà, j'ai pas testé, mais j'espère que t'as compris l'algo et les routines;
Pour les variables j'ai ma ptite convention perso, ui = unsigned int, cp = char* (pointeur), etc... tu fais comme tu le sens ça ;)


Message édité par Deather2 le 14-12-2004 à 21:23:58
n°4533
nicodache
marmotte en chocolat concept ©
Posté le 14-12-2004 à 21:36:01  profilanswer
 

je comprend pas l'utilité de garder la taille du mot précédant dans cette application...
 
[edit]ha si, pour repartir directement de la fin du mot précédent
 
par contre, tu n'affiche pas le mot, or il est demandé qu'il soit affiché


Message édité par nicodache le 14-12-2004 à 21:36:54

---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4535
Deather2
OpenBSD: the way to go!
Posté le 14-12-2004 à 21:37:38  profilanswer
 

Code :
  1. for(unsigned int i = uiLastWordSize; i < uiWordSize; i++)
  2.              {
  3.                  printf("%c", cpString[i]);
  4.              }


 
Ben euh si non? ;)


Message édité par Deather2 le 14-12-2004 à 21:38:07
n°4537
nicodache
marmotte en chocolat concept ©
Posté le 14-12-2004 à 21:42:07  profilanswer
 

ho bon dieu que c'est gore ton truc :(
 
afficher les mots lettre par lettre, et puis afficher le nombre de lettres...


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4539
Deather2
OpenBSD: the way to go!
Posté le 14-12-2004 à 21:44:57  profilanswer
 

assez oui y'a sûrement 200x mieux mais j'ai fais vite fais :D

n°4540
nicodache
marmotte en chocolat concept ©
Posté le 14-12-2004 à 21:50:10  profilanswer
 

bein le mien est aussi méga vite fait, pourtant il me semble légèrement moins gruiké...
 
m'enfin, faut voir hein ;d


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4541
Deather2
OpenBSD: the way to go!
Posté le 14-12-2004 à 21:52:31  profilanswer
 

Il est vrai que je n'excele pas en algo instantané m'bon [:dslam]

n°4542
Deadog
Dain Bramaged
Posté le 14-12-2004 à 22:25:55  profilanswer
 

strtok, et ton prof seras ravi de voir que t'as fouiller dans la glibc :D


Message édité par Deadog le 14-12-2004 à 22:26:04
n°4543
nicodache
marmotte en chocolat concept ©
Posté le 14-12-2004 à 22:26:38  profilanswer
 

oué aussi :D


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4551
Dr Lous
I see old password
Posté le 15-12-2004 à 00:29:03  profilanswer
 

sscanf ne permet pas ca ?


---------------
Oseras-tu m'affronter ?
n°4555
Deadog
Dain Bramaged
Posté le 15-12-2004 à 00:41:09  profilanswer
 

Dr Lous a écrit :

sscanf ne permet pas ca ?


 
 
sscanf c'est le diable [:sadistyk]  
 
d'accord ça va te séparer tes mots, mais faut pas oublié qu'il y a un buffer derrière à gérer [:matleflou]

n°4556
nicodache
marmotte en chocolat concept ©
Posté le 15-12-2004 à 01:18:23  profilanswer
 

et que les buffers overflow, ca tue des bébés phoques en australie


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4557
Dr Lous
I see old password
Posté le 15-12-2004 à 01:33:16  profilanswer
 

Deadog a écrit :

sscanf c'est le diable [:sadistyk]  
 
d'accord ça va te séparer tes mots, mais faut pas oublié qu'il y a un buffer derrière à gérer [:matleflou]


 
ben g pas encore le droit d'utiliser des fonctions trop folklo en labo ^^ alors je fait avec ce ke je peux [:dslam]


---------------
Oseras-tu m'affronter ?
n°4558
nicodache
marmotte en chocolat concept ©
Posté le 15-12-2004 à 01:33:59  profilanswer
 

pas encore ?
 
tsss...
 
t'as pas encore appris au prof comment coder en C ?!


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4560
Dr Lous
I see old password
Posté le 15-12-2004 à 01:58:40  profilanswer
 

je tente de me faire discret dans le new bahut [:dslam]


---------------
Oseras-tu m'affronter ?
n°4561
Deadog
Dain Bramaged
Posté le 15-12-2004 à 02:45:48  profilanswer
 

je fais déjà le prof pour les cours de rattrapage [:dslam]
le pire c'est que bientôt je devrais aussi le faire pour ceux du cycle ingé [:matleflou]


Message édité par Deadog le 15-12-2004 à 02:48:13
n°4569
biboune77
BeYhhhh
Posté le 15-12-2004 à 21:03:43  profilanswer
 

Code :
  1. void main()
  2. {
  3. char ZL[81];
  4. char *p;
  5. int nbm=0,debut,i,lgmot;
  6. printf("ZL:" );
  7. gets(ZL);
  8. do
  9. {
  10.  i=0;
  11.  do
  12.  {
  13.   for(;ZL[i]!='\0'&& ZL[i]==' ';i++);
  14.   if(ZL[i]!='\0')
  15.   {
  16.    debut=i;
  17.    nbm++;
  18.    for(;ZL[i]!='\0' && ZL[i]!=' ';i++);
  19.    lgmot=i-debut;
  20.    p=(char *)malloc(lgmot+1);
  21.    strncpy(p,&ZL[debut],lgmot);
  22.    p[lgmot]='\0';
  23.    printf("Mot %d : %d %s\n",nbm,lgmot,p);
  24.    free(p);
  25.   }
  26.  }while(ZL[i]!='\0');
  27.  printf("ZL:" );
  28.  gets(ZL);
  29. }while(*ZL);
  30. printf("%d mots dans cette phrases",nbm);
  31. }


 
voila la réponse, il fallait utiliser une fonction qu'on avait pas vu strncpy ;)

n°4570
CryoGen
Powered by kitkat©
Posté le 16-12-2004 à 08:16:25  profilanswer
 

c'est vraiment bourrin ca [:grut]

n°4571
Deather2
OpenBSD: the way to go!
Posté le 16-12-2004 à 08:22:13  profilanswer
 

Code :
  1. char ZL[81];


Bouaha !

Code :
  1. char* ZL = (char*)calloc(81, sizeof(char));


ou bien version malloc:

Code :
  1. char* ZL = (char*)malloc(81);


J'suis pas sûr que ça marche avec malloc, j'l'utilise jamais, mais normalement c'est 81*sizeof(char), mais comme ça vaut 1, bah 81 tout seul... ;)
 
ps: n'oublie pas le free à la fin sinon memory leak ;)


Message édité par Deather2 le 16-12-2004 à 08:22:32
n°4572
Deadog
Dain Bramaged
Posté le 16-12-2004 à 11:52:02  profilanswer
 

c'est plutot le

Code :
  1. gets(ZL);


qui me fait rire ...

n°4573
biboune77
BeYhhhh
Posté le 16-12-2004 à 12:33:16  profilanswer
 

Vous êtes tous des nullos, vous acceptez pas que d'autres gens débutent, je suis en IUT j'apprend ,c'est tout.Je programme avec ce que j'ai appris au fur et à mesure j'affine, alors les reflexions du genre "Ca me fait rire" vous les gardez pour vous.Gets n'est peut etre pas la meilleur fonction mais c'est ce que j'ai appris pour le moment.
 
Quand j'aurais votre niveau (aussi grand est il... :pfff: ) je pense que je valoriserai les bleus de la prog à votre contraire..
 
Le code que j'ai envoyé fonctionne très bien , d'accord il peut etre améliorer 10000 fois mais bon sang arretez de vous prendre pour des dingues quoi...  :(  
 
Aidez les débutants et mm les autres et stop les reflexions qui dévalorise le travail des autres
 
 
@+
 

n°4574
nicodache
marmotte en chocolat concept ©
Posté le 16-12-2004 à 12:41:15  profilanswer
 

c'est ton code à toi, ou celui du prof ?


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4575
biboune77
BeYhhhh
Posté le 16-12-2004 à 12:57:59  profilanswer
 

Bah c'est le code du prof pourquoi ?
 
PS: je m'attends à "Les profs ils savent rien faire nin nin nin..."
 
Pi mm j'ai compris ce code, pou moi il est clair, il fonctionne bvoila c'est tout pas besoin de critiquer

n°4576
nicodache
marmotte en chocolat concept ©
Posté le 16-12-2004 à 13:01:24  profilanswer
 

bah justement, c'est du prog que rigole ddg :D
 
on ne dira pas que le prof sait pas coder, mais j'aime vraiment pas le principe des do {} while() (while() {} powaa) paske c'est moins beau à voir :D
et ya aussi qu'il me semble avoir écrit plein de lignes pour faire un bete truc...
 
sans compter qu'il n'y a pas un seul commentaire, alors que ca me semble la condition de base pour que vous appreniez quelque chose correctement (histoire d'etre sur de comprendre ce que fait une instruction sans devoir fouiller dans des manpages en anglais sur un serveur qui met 10'' à les mettre en page (merci notre hp-ux de l'école))


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4577
Deadog
Dain Bramaged
Posté le 16-12-2004 à 13:07:59  profilanswer
 

biboune77 a écrit :

Vous êtes tous des nullos, vous acceptez pas que d'autres gens débutent, je suis en IUT j'apprend ,c'est tout.Je programme avec ce que j'ai appris au fur et à mesure j'affine, alors les reflexions du genre "Ca me fait rire" vous les gardez pour vous.Gets n'est peut etre pas la meilleur fonction mais c'est ce que j'ai appris pour le moment.
 
Quand j'aurais votre niveau (aussi grand est il... :pfff: ) je pense que je valoriserai les bleus de la prog à votre contraire..
 
Le code que j'ai envoyé fonctionne très bien , d'accord il peut etre améliorer 10000 fois mais bon sang arretez de vous prendre pour des dingues quoi...  :(  
 
Aidez les débutants et mm les autres et stop les reflexions qui dévalorise le travail des autres
 
 
@+


 
 
nop, le code du prof fonctionne mal
met voir une chaine de lpus de 50 caractères, on va voir si y marche :sleep:  
 
même mes profs ont indiqué clairement que gets, scanf et autre c'était mauvais, qu'il vallait mieux utiliser fgets qui n'est pas bcp plus compliqué d'ailleurs
 
si ton prof te l'a pas dit, alors va lui dire, pke la c'est grave de ne pas faire de précision sur ces fonctions qui sont à banir (elles devraient même pas être évoqués)

n°4578
nicodache
marmotte en chocolat concept ©
Posté le 16-12-2004 à 13:25:18  profilanswer
 

d'ailleurs, quand je compile ton programme, il me met un warning :
 

gcc a dit :

warning: the 'gets' function is dangerous and should not be used.




 
et perso je pense que les gens qui font gcc savent ce qu'ild disent ;)


Message édité par nicodache le 16-12-2004 à 13:25:37

---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4579
biboune77
BeYhhhh
Posté le 16-12-2004 à 13:26:37  profilanswer
 

mais le sujet du td demande une chain de 50 caractères donc c'est normal...Les commentaires je n'en ai pas mis car c'était trop long et pour le gets , scanf les profs nous disent au fur et à mesure que c'est pas bien que machin machin mais le code du prof fonctionne très bien dans le cadre du sujet du td. C'est sur que si on rentre des mots plus long qu'on fait si qu'on fait ca....
 
imaginez un enseignement avec dès le début des allocations ,des pointeurs ,des adresse mémoires, il y aurait 1personnes/10 qui comprendrait faut être réaliste.
 
Et si on pouvait m'expliquer pourquoi tout ca n'est pas bien gets, scanf ? merci

n°4580
nicodache
marmotte en chocolat concept ©
Posté le 16-12-2004 à 13:28:14  profilanswer
 

buffer overflow, ca te dis quelque chose ?
 
pour peu que ton programme tourne avec le suid, tu lui tape un buffer overflow dans les dents, et tu te retrouve root sur la machine sur laquelle il tourne...
 
c'est pour ca qu'on chasse ca comme la peste sur tt les services accessibles à distance (apache, ssh, ftp, mail, le kernel, etc...)
 
 
[edit]note que le programme fonctionne avec une phrase de 32 mots entre 2 et 9 lettres...
 
ca fait donc au moins 64 lettres...


Message édité par nicodache le 16-12-2004 à 13:30:08

---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4581
biboune77
BeYhhhh
Posté le 16-12-2004 à 13:32:09  profilanswer
 

non mais j'ai compris que il y avait un rapport avec of mais personne peut me dire pourquoi gets et scanf  sont à bannir, pourquoi sont ils lié à l'of ? pourquoi fgets mieux que gets ? Physiquement qu'est ce que ca change ?

n°4582
nicodache
marmotte en chocolat concept ©
Posté le 16-12-2004 à 13:33:10  profilanswer
 

simplement parce que gets rempli un buffer avec tout ce qu'il recoit, sans vérifier la taille...
 
donc si ya plus que la taille du buffer, bein ca fait un buffer overflow, et paf, pasteque


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°4583
Deadog
Dain Bramaged
Posté le 16-12-2004 à 13:33:42  profilanswer
 

-il n'est pas nécessaire de faire de l'allocation dynamique pour ça
-on pouvait rester dans le cadre du tp (pas plus de 50 char) tout en vous habituant à fgets
tu remplace simplement gets par fgets comme y faut
ça reviens au même dans le cadre du tp et hors du cadre du tp ça plantera pas (si tenté q'on gère les erreurs correctement)
-on utilise pas gets et scanf pour lire une chaîne de caractère car ces fonctions ne vérifie pas la taille du buffer dans lequel ils écrivent
ils ne se soucient pas de ta limite de 50+1 char et vont écrire dans un espace mémoire qui ne leur est pas autorisé
(on peux aussi dire à scanf de limiter, mais bon, cette méthode n'est pas très inculqué)


Message édité par Deadog le 16-12-2004 à 13:35:03
n°4584
biboune77
BeYhhhh
Posté le 16-12-2004 à 13:37:03  profilanswer
 

oki merci pour tes explications après pour les allocations dynamiques c'était pour qu'on les manipule mais il a dit que le td pouvait se faire sans ca, entièrement d'accord. :)
 
Pour tes explications je suis ok mais le fgets, il demande comme paramètres seulement le nom de la variable sans la taille ? alors pourquoi lui il vérifie la taille ?

n°4585
Deadog
Dain Bramaged
Posté le 16-12-2004 à 13:39:25  profilanswer
 

nan nan, justement, fgets prend 3 arguments :D
le pointeur, la taille à respecter et le fichier dans le quel on lit (stdin si on veux lire le clavier la plus part du temps)

n°4586
biboune77
BeYhhhh
Posté le 16-12-2004 à 13:40:28  profilanswer
 

oki merci je tacherais d'utiliser celui la maintenant et pour scanf c'est la mm histoire ? fscanf ?

mood
Google
Posté le 16-12-2004 à 13:40:28  profilanswer
 

 Page :  1  2
Page Précédente 

Aller à :
Ajouter une réponse

  FORUM Syndrome-OC - Jacky-PC


  Programmation


  Autre


  [C] Chaines de caractères

 

Hit Parade