Afficher le caractere 'e' dans une chaine

Résolu
Sabetodo Messages postés 127 Statut Membre -  
fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,les gars! j'ai juste un petit problème avec mon programme. Au fait, je dois faire un programme qui permet retrouver le caractere 'e' dans une chaine tapée à partir du terminal UNIX. je l'ai fait mais il m'affiche une seule erreur concernant l'utilisation de strlen. Voici mon code:

#include<stdio.h>
#include<string.h>
#include<conio.h>

int main (int argc, char* argv[])
{ int i,compteur;

for(i=1;i<argc;i++)
{
if('e'==strlen(argv[1][i]))
{
compteur++;
}
}
if(compteur==1)
printf("%d\n",compteur);
else
printf("0\n");
}

NB:Aidez-moi les gars!
Configuration: Windows XP
Firefox 3.0.4

6 réponses

  1. Nieli Messages postés 85 Statut Membre 6
     
    Euh tu compares une longueur avec un char Oo?
    0
  2. mype Messages postés 2459 Date d'inscription   Statut Membre Dernière intervention   437
     
    normale strlen c'est pour calculer la longueur de la chaine
    ça serait plutot
    for(i=0;i<strlen(argv[1]);i++)
    if(argv[1][i]=='e')
    compteur++;
    0
    1. Sabetodo Messages postés 127 Statut Membre 3
       
      ok Mr Mype, merci quand même. Et pourtant ce c'est que j'avais fais, mais il m'affiche des erreurs et j'ai changé.Mais de toute façon je te remercie de m'avoir repondu à temps.Bonne soireé.
      0
    2. Sabetodo Messages postés 127 Statut Membre 3
       
      juste une question: porquoi fo(i=0;i<strlen(argv[1]);i++) et non pas for(i=0;i<strlen(argv[]);i++)?
      0
      1. mype Messages postés 2459 Date d'inscription   Statut Membre Dernière intervention   437 > Sabetodo Messages postés 127 Statut Membre
         
        parce que c'est la longueur de la chaine que tu as passé en parametre et elle se trouve dans argv[1] le nom de ton programme lui par exemple se trouve dans argv[0]
        0
  3. Nieli Messages postés 85 Statut Membre 6
     
    if('e'==argv[1][i]) devrait suffire, la comparaison de characters étant autorisée.

    D'autre part tu testes :
    if(compteur==1), et si il y a 2 e dans la chaine ^^?

    Donc tu fais soit if(compteur > 0)
    ou alors tu mets un break; après compteur++;
    0
    1. Sabetodo Messages postés 127 Statut Membre 3
       
      ok, marce beaucoup Mr Nieli. Je viens de le compiler et ça passe. Mais tu pourrais me dire quel est la syntaxe et la commande qu'on utilise pour compiler et executer un programme sous MS DOS?
      0
    2. Sabetodo Messages postés 127 Statut Membre 3
       
      slt Nieli je viens de compiler mon programme sous unix il m'a affiche une erreur de segmentation. alors j'ai enleve strlen comme tu l'as dit et quand même ça ne passe pas.il m'affiche un avertissement de ce genre: warning: comparaison between pointer and integer. et lorsque je le compile il dit :segmentation fault.
      0
    3. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847 > Sabetodo Messages postés 127 Statut Membre
       
      Donne le programme que tu as testé au final.

      Sinon, il y a encore plus simple en utilisant strchr :
      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
      
      int main(int argc, char **argv){
          char *p=NULL;
          if(argc<2) exit(EXIT_FAILURE);
          p=strchr(argv[1],'e');
          if(p==NULL) puts("pas de e");
          else puts("e trouve");
      
          return 0;
      }
      

      Remarque : ce code, comme les autres qui t'ont été donnés ne cherchent que sur le premier argument. Sinon, il faut faire une boucle supplémentaire.
      0
    4. Sabetodo Messages postés 127 Statut Membre 3 > fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention  
       
      voici mon code:
      
      
      #include<stdio.h>
      #include<string.h>
      #include<conio.h>
      void main (int argc, char* argv[])
      { int i,compteur=0;

      for(i=1;i<argc;i++)
      {
      if('e'==(argv[1][i]))
      {
      compteur++;
      }
      }
      if(compteur>0)
      printf("%d\n",compteur);
      else
      printf("0\n");
      getch();
      }

      NB:Il m'affche toujours une erreur de segmentation sur l'utilisation des pointeurs.
      Au fait, tu pourrais m'expliquer le fonctionnement de ton code?
      0
    5. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847 > Sabetodo Messages postés 127 Statut Membre
       
      Normal, ton code n'est pas bon.
      Je te le corrige.
      Remarque : N'oublie pas que main retourne un entier donc c'est int main et non void main.
      De plus, il faut faire un if sur le argc pour vérifier qu'il y a au moins un argument, sinon ça fera un segfault si t'appelles le programme sans arguments.
      Ensuite tu faisais une boucle sur argc et non sur strlen(argv[1], donc le parcours était erroné.
      Et enfin, évite d'utiliser la bibliothèque conio.h qui n'est pas portable.

      #include<stdio.h>
      #include<string.h>
      #include <stdlib.h>
      
      int main (int argc, char* argv[])
      { 
           int i,compteur=0;
           if (argc<2) exit(EXIT_FAILURE);
           for(i=0;i<strlen(argv[1]);i++)
           {
                if('e'==(argv[1][i]))
                {
                     compteur++;
                 }
           }
      
           if(compteur>0)
                printf("%d\n",compteur);
           else
                printf("0\n");
      
            getchar();
            return 0;
      } 
      


      Mon code en fait utilise strchr.
      strchr(argv[1],'e') renvoie un pointeur vers le 'e' s'il est présent sinon renvoie NULL.
      Donc il reste plus qu'à savoir si le retour est NULL (pas de e) sinon il y en a un.
      Cela évite économise une boucle.

      Dernière petite remarque : quand tu postes, n'oublie pas d'inclure ton code dans la balise dédiée à cet effet (en haut tu as trois boutons, utilise le quatrième), cela permet de rendre le code lisible.
      0
  4. Nieli Messages postés 85 Statut Membre 6
     
    Pourquoi compiler sous MS-DOS. Tu ne veux pas compiler avec une app comme Dev C++ ?

    Sous MS-Dos, tu devras installer un compilateur C. Tape "compilateur c" dans google ^^.

    Bon courage
    0
    1. Sabetodo Messages postés 127 Statut Membre 3
       
      j'ai déjà un compilateur turbo c installe sur mon pc. mais je voulais le compiler sous dos. comme par exemple si j'etais sous unix j'aurais fait gcc nom_fichier.c -o nom_fichier ensuite je l'execute en faisant ./nom_fichier
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Salut,
    Ton turbo C doit sûrement avoir des exécutables (comme gcc.exe ou d'autre). Regarde dans le répertoire de l'application. Ensuite, il te restera à mettre le répertoire qui contient gcc dans le PATH.
    Cdlt
    0
  7. jolie
     
    slm, pardon mais c'est quoi un terminal UNIX ,car la solution est: mais sans utiliser la fonction main comme 1e fonction qui contient des parametres (peut etre c'est ça le TERMINAL UNIX ??) la solution:

    #include<stdio.h>
    main()
    {int i,x;
    char t[20];
    printf("entrer la chaine de caracteres");
    gets(t);
    for(i=0;t[i]!='c';i++);
    if(t[i]=='c') x=1;
    else x=0;
    if (x==1)printf("le caractere 'c' se trouve dans la chaines de carecteres");
    else ("le carectere 'c' ne se trouve pas dans la chaine de caracteres");
    getch();
    }
    essay de l'executer et merci.
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Salut,
      Son problème est déjà résolu ;)
      Et puis, le terminal UNIX c'est tout simplement une fenêtre dans lequel tu peux taper des commandes.
      Enfin ton programme n'est pas portable (getch), t'as pas inclus conio.h et enfin, il ne faut pas utiliser gets, mais fgets !
      Ensuite, l'algorithme est erroné, tu fais une boucle for dans le vide.
      Cdlt
      0