Fonction atoi, débutant, c++,help [Résolu]

oli1207
Messages postés
4
Date d'inscription
jeudi 8 novembre 2007
Dernière intervention
29 novembre 2007
- 28 nov. 2007 à 01:00 - Dernière réponse : oli1207
Messages postés
4
Date d'inscription
jeudi 8 novembre 2007
Dernière intervention
29 novembre 2007
- 29 nov. 2007 à 00:19
re bonjour
voila j'ai un problème j'arrive pas a faire marcher la fonction atoi je sais plus quoi faire j'ai essayé ce que je savais mais rien y fait il veut pas passer cette condition quoi que ce soit que tu rentre qui peut m'aider svp ?

if ((97 - (atoi(insee_car) % 97)) != insee_key)
{
printf("saisie3 éronnée \n");
}

else

{

valid = true ;
}
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
titof3812
Messages postés
18
Date d'inscription
lundi 12 novembre 2007
Dernière intervention
12 décembre 2007
- 28 nov. 2007 à 23:13
3
Merci
oups au fait j'ai assui commenter le #include stdfax.h qui est specifique windows
et vu que je suis sur mon mac ;-)
pense a le remettre

Merci titof3812 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de titof3812
SAKingdom
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Dernière intervention
16 février 2009
- 28 nov. 2007 à 02:07
0
Merci
Hmmm
insee_car c'est quoi ?
Si il s'agit bien d'un pointeur char (char*), le problème vient de ton calcule.
Si il s'agit d'autre chose, atoi ne convertie que des char*

D'après le nom, je présuppose que, si il ne s'agit pas d'un pointeur char, il doit s'agir d'un char.
Si c'est le cas, inutile de passer par une fonction. Suffis de soustraire 0x30 (le caractère '0')

char c = '5';
int i = c-'0';

i contiendra 5

C++ (@++)
Commenter la réponse de SAKingdom
SAKingdom
Messages postés
3213
Date d'inscription
lundi 7 novembre 2005
Dernière intervention
16 février 2009
- 28 nov. 2007 à 02:52
0
Merci
Bon ici, quand je parle de pointeur char (char*), je veux parler d'une chaine de caractères.

C++ (@++)
Commenter la réponse de SAKingdom
oli1207
Messages postés
4
Date d'inscription
jeudi 8 novembre 2007
Dernière intervention
29 novembre 2007
- 28 nov. 2007 à 18:01
0
Merci
ok merci pour la réponse je vais vous donner tout l'algo comme ça tout sera claire$
 
#include

"stdafx.h"#include

<stdlib.h>#include

<stdio.h>#define

MAXI1 15
// prototypage

bool

test(
int an);
void

sschaine(
char insee_string[MAXI1],
int inddeb,
int long1 ,
char masouschaine[MAXI1]);
int

longueur(
char machaine[MAXI1]);
void

main (
void){

bool valid =
false;                                    //délclaration des variable

bool bissextile;

char insee_car[MAXI1]=
"";

char insee_string[MAXI1]=
"";

char masouschaine[MAXI1]=
"";

char masouschaine1[MAXI1]=
"";

char masouschaine2[MAXI1]=
"";

int insee_key;

int annee;

int cle_nb;

int insee_nb;

do                                                      //boucle{

printf (

"Saisir votre numéro Insee \n");scanf(

" %s",&insee_string,
'\0');sschaine(insee_string,0,1,masouschaine);

sschaine(insee_string,0,13,insee_car);

sschaine(insee_string,14,2,masouschaine2);

insee_key = atoi(masouschaine2);

if ( longueur(insee_string) != MAXI1 )                           //vérification de la longueur du numéro{

printf(

"saisie1 éronnée \n");}

else{

if (( atoi(masouschaine) != 1) && ( atoi(masouschaine) != 2) )               //différent de 1 ou 2 (premier chiffre du numéro pour vérifier fille ou garçon{

printf(

"saisie2 éronnée \n");                                       }

else{

int cle_nb=atoi(insee_key);

int insee_nb=atoi(insee_car);

if ((97-(insee_nb%97))! = cle_nb)                                          //opération pour déterminer si l'année est bissextile ou non{

printf(

"saisie3 éronnée \n");}

else{

valid =

true ;}

}

}

}

while (valid ==
false);sschaine(insee_string,1,2,masouschaine);

annee = atoi(masouschaine);

annee = annee + 1900;

bissextile = test(annee);

sschaine(insee_string,0,1,masouschaine);

if (atoi(masouschaine) == 1){

if (bissextile ==
true){

printf(

"Monsieur vous êtes né une année bissextile \n");}

else{

printf(

"Monsieur vous êtes né une année non bissextile \n");}

}

else{

if (bissextile ==
true ) {

printf(

"Madamme vous êtes née une année bissextile \n");}

else{

printf(

"Madamme vous êtes née une année non bissextile \n");}

}

system(

"pause");}

// Fin du main

bool

test(
int an)                                 //test de l'année bisextile{

bool

bissext =
false;

if ((an % 4 )!= 0){

bissext =

false ;}

else{

if ((an % 100 )!= 0){

bissext =

true ;}

else{

if ((an % 400 )!= 0){

bissext =

false ;}

else{

bissext =

true ;}

}

}

return bissext; }

// Fin de la fonction test()void

sschaine(
char insee_string[MAXI1],
int inddeb,
int long1 ,
char masouschaine[MAXI1])         //fonction sschaine( ){

int j;

int indfin;

int i;indfin = inddeb + long1 ;

j = 0;

for (i = inddeb; i < indfin ; i++){

masouschaine[j] = insee_string[i];

j++ ;

}

masouschaine[j] =

'\0';}

// fin de la fonction sschaine()int

longueur(
char machaine[MAXI1])   //fonction longueur pour vérifier la longueur de la chaine{

int i = 0;

while (machaine[i] !=
'\0'){

i = i + 1;

}

return i;}

voila c'est ce qui ya en gras mais si vous voyez des erreurs vous pouvez me dire lesquelles elles sont svp ? merci je ne crois pas qu'il y en ai mais on ne sait jamais
Commenter la réponse de oli1207
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 28 nov. 2007 à 21:57
0
Merci
Faudrait déjà être cohérent:

#define MAXI1 15
char insee_string[MAXI1];
if(longueur(insee_string) != MAXI1) {
   printf("saisie1 éronnée \n");
}

JAMAIS strlen d'un char[15] NE DOIT REPONDRE 15 mais toujours < 15 sinon c'est qu'on a lu hors du buffer.

int test(int an)
{
  return ((an & 3) == 0 && ((an % 100) != 0 || (an % 400) == 0));
}

int longueur(char *machaine)
{
  char *c = machaine;
  while(*c) c++;
  return (c - machaine);
}

void sschaine(...) est une vraie source de plantage, forts risques de lecture et écriture hors buffer.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
BruNews
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
- 28 nov. 2007 à 22:11
0
Merci
Je remets ton code présenté convenablement.
Quand on cherche des réponses, on fait en sorte de ne pas rebuter ceux qui seraient disposés à les apporter.
Tu repartiras d'un copier coller de ce qui est dessous.

#include <stdafx.h>
#include <stdlib.h>
#include <stdio.h>
#define MAXI1 15


int test(int an);
void sschaine(char insee_string[MAXI1],int inddeb,int long1 , char masouschaine[MAXI1]);
int longueur(char machaine[MAXI1]);


void main (void)
{
  int valid = 0;
  int bissextile;
  char insee_car[MAXI1];
  char insee_string[MAXI1];
  char masouschaine[MAXI1];
  char masouschaine1[MAXI1];
  char masouschaine2[MAXI1];
  int insee_key;
  int annee;
  int cle_nb;
  int insee_nb;
  do {
    printf("Saisir votre numéro Insee \n");
    scanf(" %s",&insee_string, '\0');
    sschaine(insee_string,0,1, masouschaine);
    sschaine(insee_string,0,13, insee_car);
    sschaine(insee_string,14,2, masouschaine2);
    insee_key = atoi(masouschaine2);
    if(longueur(insee_string) != MAXI1) {
      printf("saisie1 éronnée \n");
    }
    else {
      if((atoi(masouschaine) != 1) && ( atoi(masouschaine) != 2) ) {   //différent de 1 ou 2 (premier chiffre du numéro pour vérifier fille ou garçon
        printf("saisie2 éronnée \n");
      }
      else {
        int cle_nb = atoi(insee_key);
        int insee_nb = atoi(insee_car);
        if((97-(insee_nb%97))!= cle_nb) {  //opération pour déterminer si l'année est bissextile ou non
          printf("saisie3 éronnée \n");
        }
        else {
          valid = true;
        }
      }
    }
  } while(!valid);
  sschaine(insee_string,1,2,masouschaine);
  annee = atoi(masouschaine);
  annee = annee + 1900;
  bissextile = test(annee);
  sschaine(insee_string,0,1,masouschaine);
  if(atoi(masouschaine) == 1) {
    if(bissextile) {
      printf("Monsieur vous êtes né une année bissextile \n");
    }
    else {
      printf("Monsieur vous êtes né une année non bissextile \n");
    }
  }
  else {
    if(bissextile) {
      printf("Madamme vous êtes née une année bissextile \n");
    }
    else {
      printf("Madamme vous êtes née une année non bissextile \n");
    }
  }
  system("pause");
}




int test(int an)
{
  return ((an & 3) == 0 && ((an % 100) != 0 || (an % 400) == 0));
}




void sschaine(char insee_string[MAXI1], int inddeb, int long1, char masouschaine[MAXI1])
{
  int j, i;
  int indfin;
  indfin = inddeb + long1;
  j = 0;
  for(i = inddeb; i < indfin ; i++) {
    masouschaine[j] = insee_string[i];
    j++;
  }
  masouschaine[j] = '\0';
}

int longueur(char *machaine)
{
  char *c = machaine;
  while(*c) c++;
  return (c - machaine);
}

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
oli1207
Messages postés
4
Date d'inscription
jeudi 8 novembre 2007
Dernière intervention
29 novembre 2007
- 28 nov. 2007 à 22:47
0
Merci
ouai désolé pour la présentation, mais eu j'ai toujours pas trouver personne n'a la réponse ? parce que le programme ne passe toujours pas saisie 3
Commenter la réponse de oli1207
titof3812
Messages postés
18
Date d'inscription
lundi 12 novembre 2007
Dernière intervention
12 décembre 2007
- 28 nov. 2007 à 23:07
0
Merci
Salut oli1207

le probleme principale dans ton test est que un numero SS a 15 chiffre donc ton insee_car en a 13 et ne peut pas ter code dans un int par atoi tu doit au minimum utiliser un long long

suivant le compilateur tu peut utiliser
insee_nb =atoll (insee_car)
ou mieux
insee_nb =strtoll(insee_car, (char **)NULL, 10);

Je t'ai fait une petite correction ( sur mac avec un compilateur gcc) qui semble fonctionner essaie de voir ce que tu peut en tirer.

Note
1 Je me suis defineie TRUE et false et passe les bool en int paour pas me prendre la tete a trouver les definition en gcc mais tu doit pouvoire revenir au bool sur ton system.
2 ta fonctin longueur existe deja et s'appelle strlen en C
3 masouchaine2 doit demarrer de 13 et pas de 14
4 cle_nb etait mal definie car insey_key est deja un int donc atol ( inseykey) n'est pas correct

Bonne continuation mais structure un peu c'est plus facile alire

--------------------------------------
//#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#define MAXI1 15
#define TRUE 1
#define FALSE 0


// prototypage

int test(int an);
void sschaine(char insee_string[MAXI1+5],int inddeb,int long1 , char masouschaine[MAXI1+5]);
int longueur(char machaine[MAXI1+5]);
void main (void)
{

int valid = FALSE; //délclaration des variable
int bissextile;
char insee_car[MAXI1+5]="";
char insee_string[MAXI1+5]="";
char masouschaine[MAXI1+5]="";
char masouschaine1[MAXI1+5]="";
char masouschaine2[MAXI1+5]="";
int insee_key;
int annee;
int cle_nb;
int insee_nb;

if (TRUE)
printf ( "True=%i\n",TRUE);
else
printf ("True= %i\n",FALSE);

do //boucle
{
printf ("Saisir votre numéro Insee \n");
scanf(" %s",&insee_string, '\0');
sschaine(insee_string,0,1,masouschaine);
sschaine(insee_string,0,13,insee_car);
sschaine(insee_string,13,2,masouschaine2);
insee_key = atoi(masouschaine2);

printf ("%s\n%s\n%s\n", masouschaine, insee_car, masouschaine2);
if ( longueur(insee_string) != MAXI1 ) //vérification de la longueur du numéro
{
printf("saisie1 éronnée \n");
}
else
{
if (( atoi(masouschaine) != 1) && ( atoi(masouschaine) != 2) ) //différent de 1 ou 2(vérifier fille ou garçon
{
printf( "saisie2 éronnée \n");
}
else
{

int cle_nb=(insee_key);
long long insee_nb;
insee_nb =strtoll(insee_car, (char **)NULL, 10);
//insee_nb =atoll(insee_car);
if ((97-(insee_nb%97))!= cle_nb) //opération pour déterminer si l'année est bissextile ou non
{
printf("saisie3 éronnée \n");
}
else
{
printf ("saisie valid \n");
valid =TRUE ;
}
}

}

} while (valid == FALSE);
printf ("sortie boucle\n");
sschaine(insee_string,1,2,masouschaine);
annee = atoi(masouschaine);
annee = annee + 1900;
bissextile = test(annee);
sschaine(insee_string,0,1,masouschaine);
if (atoi(masouschaine) == 1)
{
if (bissextile == TRUE)
{
printf( "Monsieur vous êtes né une année bissextile \n");
}
else
{
printf( "Monsieur vous êtes né une année non bissextile \n");
}

}
else
{
if (bissextile == TRUE )
{
printf( "Madamme vous êtes née une année bissextile \n");
}
else
{
printf( "Madamme vous êtes née une année non bissextile \n");
}

}

}

// Fin du main
int test(int an) //test de l'année bisextile
{

int bissext = FALSE;
if ((an % 4 )!= 0)
bissext =FALSE ;
else
{
if ((an % 100 )!= 0)
bissext =TRUE ;
else
{
if ((an % 400 )!= 0)
bissext = FALSE ;
else
bissext = TRUE ;
}

}

return bissext;
}

// Fin de la fonction test()
void

sschaine(char insee_string[MAXI1+5],int inddeb,int long1 , char masouschaine[MAXI1+5]) //fonction sschaine( )
{
int j;
int indfin;
int i;
indfin = inddeb + long1 ;
j = 0;
for (i = inddeb; i < indfin ; i++)
{
masouschaine[j] = insee_string[i];
j++ ;
}

masouschaine[j] ='\0';
}

// fin de la fonction sschaine()
int

longueur(char machaine[MAXI1+5]) //fonction longueur pour vérifier la longueur de la chaine
{
int i = 0;
while (machaine[i] != '\0')
i = i + 1;
return i;
}
Commenter la réponse de titof3812
oli1207
Messages postés
4
Date d'inscription
jeudi 8 novembre 2007
Dernière intervention
29 novembre 2007
- 29 nov. 2007 à 00:19
0
Merci
merci mai le programme ne fonctionne toujours pas alors vu que sa fait 2 jours que je me fai chi.... sur ce prog ben j'ai virer la condition avec le modulo 97 voila bon ben merci a tous sinon sa marche mais la saisie 3 est enlever voila a++
Commenter la réponse de oli1207

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.