Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme concernant mon programme

chaine de caractères et entier

    24 octobre 2008 à 0:47:18

    Bonjour,

    Je suis débutant en C, je suis en 1ere année d'informatique à la fac et je suis en train de réaliser un programme. Ce dernier a pour fonction de déterminer suivant le numéro de téléphone entré, à quel opérateur il est attribué (je dispose de la base de donnée téléchargée sur internet)

    Cependant j'ai un problème concernant la mise en forme du programme.
    Le numéro de téléphone portable saisie par l'utilisateur doit être de type char ? car pour dire de quel opérateur il s'agit, je dois comparer les 4 premiers chiffres du numéro de téléphone saisi avec ceux de ma base de donnée (par exemple 0684 correspond à un numéro Orange).

    Que dois-je faire pour arriver a faire cela ? Saisir le numéro, et comparer les 4 premiers chiffres de ce dernier avec 0684 par exemple. Je ne dois pas utiliser le type int ? car je veux aussi que le programme limite seulement l'entrée de chiffres, que si la personne saisit des caractères autres qu'un numéro de téléphone (0612345678), le programme dise : Erreur de saisie ! Veuillez recommencer :
    Or si la variable est un type char, comment faire cette restriction ?

    Merci d'avance pour votre aide, en espérant que vous ayez compris ce que je souhaite faire.
    • Partager sur Facebook
    • Partager sur Twitter
      24 octobre 2008 à 0:56:28

      Bonjour,

      Citation : shaoling87

      Je ne dois pas utiliser le type int ? car je veux aussi que le programme limite seulement l'entrée de chiffres, que si la personne saisit des caractères autres qu'un numéro de téléphone (0612345678), le programme dise : Erreur de saisie ! Veuillez recommencer :
      Or si la variable est un type char, comment faire cette restriction ?



      Au contraire, si tu veux sécuriser l'entrée, il est nécessaire de la récupérer dans une chaine de caractères. Qu'est-ce qu'est censé contenir ton int si l'utilisateur saisit "blabla" ? D'autant plus que stocker 10 chiffres dans un int... ça risque de ne pas rentrer.
      Regarde du côté de isdigit.
      • Partager sur Facebook
      • Partager sur Twitter
        24 octobre 2008 à 7:23:14

        Salut

        Ici si tu ne veux que 4 chiffres et tu veux sécuriser la saisie, je te proposerai d'utiliser scanf () qui, dans ce cas, si tu sais/regardes comment le sécuriser, est le mieux je pense.

        @mcyrb : shaoling87 ne veut récupérer que des nombres, pourquoi s'embêter avec une chaine de caractère?
        • Partager sur Facebook
        • Partager sur Twitter
          24 octobre 2008 à 10:00:48

          Citation : Goost

          Salut

          Ici si tu ne veux que 4 chiffres et tu veux sécuriser la saisie, je te proposerai d'utiliser scanf () qui, dans ce cas, si tu sais/regardes comment le sécuriser, est le mieux je pense.

          @mcyrb : shaoling87 ne veut récupérer que des nombres, pourquoi s'embêter avec une chaine de caractère?



          Il ne compare que 4 chiffres mais il est quand meme oblige de stocker les 10 que l'utilisateur entre, et 10 chiffres c'est trop pour un int. Un tableau de char est plus adapte et tout aussi simple
          • Partager sur Facebook
          • Partager sur Twitter
            24 octobre 2008 à 12:33:53

            Citation : joccd

            Il ne compare que 4 chiffres mais il est quand meme oblige de stocker les 10 que l'utilisateur entre, et 10 chiffres c'est trop pour un int. Un tableau de char est plus adapte et tout aussi simple



            Et non... un numéro de téléphone commence par 0, de fait la valeur entrée vaut k*10^8 (avec k entier naturel < 10)donc un int suffit.
            • Partager sur Facebook
            • Partager sur Twitter
              24 octobre 2008 à 13:52:49

              Citation : Goost

              @mcyrb : shaoling87 ne veut récupérer que des nombres, pourquoi s'embêter avec une chaine de caractère?



              Je trouve pas les chaînes de caractères particulièrement embêtantes, au contraire, surtout lorsqu'il s'agit de récupérer directement une entrée textuelle (clavier ou fichier). Et puis un numero de telephone, même si ça rentre dans un int, c'est comme un numero INSEE (qui lui ne rentre pas), ça n'a pas de sens en tant que nombre entier relatif, le but n'étant pas d'effectuer des opérations arithmétiques dessus, mais plutôt de pouvoir accéder aux différents caractères qui composent sa représentation en base 10.
              Quitte à prendre quelques octets de plus, je trouve la représentation sous forme de chaine de caractères plus pratique et plus sensée.
              • Partager sur Facebook
              • Partager sur Twitter
                24 octobre 2008 à 14:38:46

                Citation : Goost

                Citation : joccd

                Il ne compare que 4 chiffres mais il est quand meme oblige de stocker les 10 que l'utilisateur entre, et 10 chiffres c'est trop pour un int. Un tableau de char est plus adapte et tout aussi simple



                Et non... un numéro de téléphone commence par 0, de fait la valeur entrée vaut k*10^8 (avec k entier naturel < 10)donc un int suffit.



                La je dis stop... int c'est -32 768 à 32 767 ou plus mais ça peut s'arreter a 32 767.

                Et pour les numéros de téléphone étrangers?
                Un usigned int/long va jusqu'a 4 294 967 295 sur un processeur classique 32bit,
                Un numero de telephone français a partir de l'international c'est 0033.x.xx.xx.xx.xx, un unsigned int/long est donc trop petit pour accepter cette saisie.

                D'autant que l'a fait très justement remarqué mcyrb, un numero de telephone n'est pas un nombre (les operations sur les nombres n'ont aucun sens avec les numero de telephones), c'est un mot composé caracteres de l'alphabet numerique.
                • Partager sur Facebook
                • Partager sur Twitter
                  24 octobre 2008 à 16:40:42

                  Bonjour,

                  Merci pour vos réponses. Voici la partie du code où le problème se pose :

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

                  void mobile()
                  {
                  char num[10], numero[4];
                  printf("Entrez votre numero de mobile (ex: 0678901234) : "); fflush(stdout);
                  scanf("%s", &num[]);
                  strncpy(numero, num, 4);
                  printf("%s", numero);
                  }

                  int main(void)
                  {
                  int choix;

                  printf("\n\t== Operation Mobile ==\n"
                  "\t----------------------\n\n\n");

                  printf("Faite votre choix :\n\n");
                  printf("1 > Trouver l'operateur d'un Mobile\n"
                  "2 > Trouver l'operateur d'un Fixe\n\n"
                  "3 > Quitter");

                  do {
                  scanf("%d", &choix);
                  switch(choix)
                  {
                  case 1: mobile(); break;
                  case 2: printf("En construction\n"); break;
                  case 3: printf("\nMerci d'avoir utilise Operation Mobile !\nPour me contacter : xxxxxx@gmail.com\nA Bientot ;-)"); break;
                  default : printf("Erreur !\nRefaite votre choix : "); fflush(stdout);
                  }
                  }
                  while ( choix != 1 || choix != 2 || choix != 3 );

                  return 0;
                  }
                  ------------------------------------------------

                  La fonction mobile() comparera le numéro de téléphone entré (les 4 premiers chiffres) avec les 4 chiffres représentant l'opérateur téléphonique.
                  num[10] = le tableau comportant le numéro de téléphone saisie au clavier ?
                  numero[4] = le tableau ou sera stocké les 4 chiffres faisant référence à l'opérateur.

                  Voilà, ici je veux juste copier les 4 premiers chiffres du numéro saisi dans numero afin de voir si ca fonctionne... faire un test de ma saisie de chaine quoi ...

                  Quand je compile voici l'erreur affichée : operateur.c:8: attention : format «%s» expects type «char *», but argument 2 has type «char (*)[10]»

                  Quelqu'un pourrait m'aider ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                    24 octobre 2008 à 16:44:44

                    Citation : Goost

                    Salut

                    Ici si tu ne veux que 4 chiffres et tu veux sécuriser la saisie, je te proposerai d'utiliser scanf () qui, dans ce cas, si tu sais/regardes comment le sécuriser, est le mieux je pense.

                    @mcyrb : shaoling87 ne veut récupérer que des nombres, pourquoi s'embêter avec une chaine de caractère?


                    Mauvaise analyse des données.

                    Comment différencier

                    003312345678 de
                    3312345678

                    c'est pas pareil...

                    un numéro de téléphone est une chaine : un numéro (number) et un nombre (value), ce n'est pas la même chose...
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Music only !
                      24 octobre 2008 à 16:47:35

                      il faut que tu passes en parametre le tableau, cad num, et non pas un pointeur vers ce tableau.
                      scanf("%10s", num);  // prend au max les 10 premiers char, evite les comportements infedinis
                      while(getchar()!='\n'); // vide le reste du buffer
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        24 octobre 2008 à 17:40:04

                        Il s'agit tout simplement de créer plusieurs variables pour chacune des catégories (par example, au québec, c'est (XXX) YYY-ZZZZ
                        où XXX est le code régional, YYY la première partie du numéro et ZZZZ la deuxième). Donc il suffirait de faire
                        scanf("(%ld) %ld-%ld", &x, &y, &z);
                        
                        en spécifiant la structure utilisée à l'utilisateur. Il suffit de faire de même pour les numéros en france.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          24 octobre 2008 à 18:09:43

                          Citation : Firestom

                          Il s'agit tout simplement de créer plusieurs variables pour chacune des catégories (par example, au québec, c'est (XXX) YYY-ZZZZ
                          où XXX est le code régional, YYY la première partie du numéro et ZZZZ la deuxième). Donc il suffirait de faire

                          scanf("(%ld) %ld-%ld", &x, &y, &z);
                          

                          en spécifiant la structure utilisée à l'utilisateur. Il suffit de faire de même pour les numéros en france.


                          Marche pas. Comment tu différencies les 0 en têtes ?

                          Et pour les formats internationaux genre +33123456789 ?

                          Un numéro de téléphone est une chaine de caractères. Point. Il n'y a pas matière à discussions...

                          1 er exemple pris au hasard :

                          http://msdn.microsoft.com/fr-fr/library/ms172599.aspx

                          Citation : MSDN


                          #

                          1.

                          Nom de la colonne : Nom, Type de données : nvarchar, Longueur : 50
                          2.

                          Nom de la colonne : Adresse, Type de données : nvarchar, Longueur : 50
                          3.

                          Nom de la colonne : Ville, Type de données : nvarchar, Longueur : 50
                          4.

                          Nom de la colonne : Téléphone, Type de données : nvarchar, Longueur : 50

                          #

                          • Partager sur Facebook
                          • Partager sur Twitter
                          Music only !

                          Probleme concernant mon programme

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown