begin process at 2012 05 29 10:52:45
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Débutant(e)

 > 

efficacité de scanf sur des chaine


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

efficacité de scanf sur des chaine

dimanche 27 mai 2007 à 21:14:34 | efficacité de scanf sur des chaine

darkwhite

Salut a tous, je dois faire un prog qui affiche les initiales d'une chaine en majuscule :
ex
en entrée:
vive le c
en sortie:
VLC


Au debut j'ai penssé a ce code
#include <stdio.h>


int main()
{
  char chaine[256]=" ",chaine2[256]=" ";
  int i,j = 0;
  //saisie de la chaine  
  scanf("%s",&chaine[i]);
  //on transforme d'office le premier caractere
  chaine2[0]=chaine[0]-32;
  j++;
 
     while(chaine[i]!='\0')
       {
     if(chaine[i]=' ')
       {chaine2[j]=chaine[i+1]-32;
       j++;
       }
     i++;
     
       }
     //on affiche la chaine
     printf("%s\n",chaine2);
     return 0;
}

Mais j'avais des resultat incoherent. puis a l'aide d'une simple boucle j'ai remarqué que scanf("%s") stoppe la saisie quand le caractere est un espace.
En effet javais saisi "vive le c" et avec la boucle je constatais qu'il n'y avait  plus que "vive" dans la chaine.

J'ai donc essayé de changer le mode de saisie de la chaine :

#include <stdio.h>


int main()
{
  char chaine[256]=" ",chaine2[256]=" ";
  int i,j = 0;
 do
   {
      scanf("%c",&chaine[i]);
      i++;
    } while (chaine[i]!='\0');
 
 /* Boucle pour verifier la chaine
for (i=0;i<10;i++)
   printf("%d=%c\n",i,chaine[i]);*/
 
  chaine2[0]=chaine[0]-32;
    j++;
    while(chaine[i]!='\0')
      {
    if(chaine[i]=' ')
      {chaine2[j]=chaine[i+1]-32;
      j++;
      }
    i++;
   
      }
    printf("%s\n",chaine2);
    return 0;
}

Or ici j'ai une erreur de segmentation.
Voila j'attends vos reponsses (et je sent que j'ai fait une connerie mais c'est pas grave )
dimanche 27 mai 2007 à 21:51:04 | Re : efficacité de scanf sur des chaine

The_Guardian

Salut,

Je te conseille d'utiliser une boucle while avec un getc, qui s'arrete des que tu trouves un \n tu mets tout ca dans une chaine, admettons puis tu fais une boucle de la maniere suivante:

debutDeMot <--- vrai tantque chaine non terminee faire
si le caractere courant est une lettre et debutDeMot alors
afficher en majuscule le caractere
 finsi 
si le caractere courant est un espace alors
   debutDeMot <--- vrai
  sinon
debutDeMot <--- faux
   finsi
 aller au caractere suivant
 finsi

===
dimanche 27 mai 2007 à 22:08:02 | Re : efficacité de scanf sur des chaine

darkwhite

heu getc t'es sur ?
car quand je fais 
#include <stdio.h>
#include <string.h>

int main()
{
  char chaine[256]=" ",chaine2[256]=" ";
  int i,j = 0;
 do
   {
      getc(chaine);
      i++;
    } while (chaine[i]!='\0');
 
 /* Boucle pour verifier la chaine
for (i=0;i<10;i++)
   printf("%d=%c\n",i,chaine[i]);*/
 
  chaine2[0]=chaine[0]-32;
    j++;
    while(chaine[i]!='\0')
      {
    if(chaine[i]=' ')
      {chaine2[j]=chaine[i+1]-32;
      j++;
      }
    i++;
   
      }
    printf("%s\n",chaine2);
    return 0;
}

a la compilation sa me dit :
pierre@darkwhite:~/C/ioi$ gcc -o initiales initiales.c
initiales.c: In function 'main':
initiales.c:10: warning: passing argument 1 of '_IO_getc' from incompatible pointer type

et avec gets sa marche mé sa segfault apres
dimanche 27 mai 2007 à 22:17:51 | Re : efficacité de scanf sur des chaine

Nicolas___

non , utilise plutot gets();
Contrairement au scanf ca ne s arrete pas a l espace

ex:
char maChaine[50];
printf("Entrez un mot \n");
gets(maChaine);

Voila apres tu lis ta chaine comme d'hab

Tu calcule la longueur de ta chaine strlen(maChaine) #include <string.h>
tu fais une boucle genre for(i=0;i<strlen(maChaine),i-;++)

et qd il le faut tu met tu rempli ta chaine2

ciao

dimanche 27 mai 2007 à 22:19:01 | Re : efficacité de scanf sur des chaine

Nicolas___

et avec gets sa marche mé sa segfault apres

déso j ai vu ca apres ms en meme tps comprends rien a ceux que tu veux dire
dimanche 27 mai 2007 à 22:24:44 | Re : efficacité de scanf sur des chaine

darkwhite

Et bien moi je veux que par exemple ta une chaine :
bonjour tous le monde
et en sortie ta que les initiales des mots :
BTM

et en utilisant gets :
#include <stdio.h>
#include <string.h>

int main()
{
  char chaine[256]=" ",chaine2[256]=" ";
  int i,j = 0;
 do
   {
      gets(chaine);
      i++;
    } while (chaine[i]!='\0');
 
 /* Boucle pour verifier la chaine
for (i=0;i<10;i++)
   printf("%d=%c\n",i,chaine[i]);*/
 
  chaine2[0]=chaine[0]-32;
    j++;
    while(chaine[i]!='\0')
      {
    if(chaine[i]=' ')
      {chaine2[j]=chaine[i+1]-32;
      j++;
      }
    i++;
   
      }
    printf("%s\n",chaine2);
    return 0;
}

A la compilation j'ai :
pierre@darkwhite:~/C/ioi$ gcc -o initiales initiales.c
/tmp/cciyavwf.o: dans la fonction « main »:
initiales.c:(.text+0x7f): AVERTISSEMENT: the `gets' function is dangerous and should not be used.


A l'execution j'ai :
pierre@darkwhite:~/C/ioi$ ./initiales
bonjour a tous
Erreur de segmentation


dimanche 27 mai 2007 à 22:28:56 | Re : efficacité de scanf sur des chaine

SAKingdom

Membre Club
Voici quelque chose de fonctionnel:

int main ()
{
    char buf[256], *c = buf;

    fgets(buf, sizeof(buf), stdin);

    if(*c >= 'a' && *c <= 'z')  *c++  -= 32;
    while(*c)
       if(*c++ == ' ' && (*c >= 'a' && *c <= 'z')) *c -= 32;

    printf("%s\n", buf);

    return 0;
}



C++ (@++)

dimanche 27 mai 2007 à 22:35:50 | Re : efficacité de scanf sur des chaine

darkwhite

hum,
J'aurais quelques questions
1) Dejà chez moi sa marche pas car je crois sakingdom que tu n'a pas saisi ce que je veux :
en effet avec ton  code j'ai :
En entree: "bonjours a tous" et en sortie: "Bonjour A Tous"
Or moi je veux  En entree: "bonjours a tous"et en sortie: "BAT"

2) Pourquoi vous utilisez toujours des pointeurs au lieu d'utiliser la forme de tableau? Sa sert a rien de mettre un pointeur en plus la ??????


dimanche 27 mai 2007 à 22:38:02 | Re : efficacité de scanf sur des chaine

The_Guardian

SAKingdom

code bien illisible mais bravo, bel effort, peu de caracteres :p

j'aime assez

===

dimanche 27 mai 2007 à 22:40:15 | Re : efficacité de scanf sur des chaine

The_Guardian

darkwhite

je pense avoir donne le code pour faire ca nous non ?
avec debutDeMot

===


1 2

Cette discussion est classée dans : int, chaine, scanf, vive, chaine2


Répondre à ce message

Sujets en rapport avec ce message

int => chaine de caractères ? [ par kjus ] vala, il me faudrait transformer une variable int en chaine de caractère.Y a-t-il une fonction toute faite ?en fait, mon but est de l'inscrire dans un Convertion "15"(string) --> 15(int) [ par crocejf2000 ] (Re)SalutIl faut que je test ma chaine et que je la convertisse si je peut. Avec atoi("12"), ca me donne bien 12, mais si je fait un atoi("12hach"), c help :: String => Int [ par Skyman ] Comment on fait pour changer un string en int ou en long ?ex :char *chaine;int entier;long entierlong;chaine = "1234";int = chaine; // (int = 1234) Algo trop lent :( [ par MoDDiB ] Bon tout d'abord je tient à préciser qu'il s'agit du concours prologin auquel je compte participer donc si certaines personnes ne veulent pas m'aider scanf() [ par clb ] bonjour à tous,j'ecris par exemple :int fonction(){ if(true) return 0; else return -1}dans main, si cette fonction retourne 0,alors j'appli convertir des chaine en type int [ par super ienien ] comment convertit on des chaine de type char en type entier ou inversementmeci d'avance programme en C [ par graminach ] on a un pb pour la question 2b!le programme ne tourne pas en boucle et affiche meme en cas de valeur correcte erreurmerci d'avancehttp://www-ipst.u-st Separer une chaine en sous chaine [ par firemax ] Bonjour Je me posais une question , j'aimerais diviser une chaine en sous chaine pour pouvoir ensuite les trier par longueur de chaine de caractere Modifier un caractere dans une chaine [ par floche ] Bonjours à tous Le titre est assez explicite... Je voudrais pouvoir changer un caractere d une chaine si c'est un a mais ca ne marche pas. Merci pour transformer un int en chaine de caractère [ par lenneth666 ] Voila j'ai comme code ceci char *tmp2=(char *)malloc(5000); int res = 15; je voudrais savoir comment mettre res dans tmp2 le cast ne marche pas, et


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,150 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales