IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

tranformer un string en int (problème)


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 46
    Par défaut tranformer un string en int (problème)
    Bonjour,
    Je suis en train d'apprendre à programmer en C mais malheureusement les cours sont en finnois et je ne comprends pas grand chose .
    je vais peut être me faire taper dessus mais je tente le coup . Le but de mon programme C est de lire une string écrite en command line argument et de la transformer en C. J'ai pensé utiliser la fonction scanf. L'appel du programme et la donnée des paramêtre se fait en même temps. Je ne sais pas si ce que je dis est compréhensible donc je vais mettre des exemples avec les résultats voulu en dessous:

    ./monProg
    ERROR

    ./monProg 1 abc
    ERROR

    ./monProg -25.3
    ERROR: valeur différente de 0123456789

    ./monProg 25.5
    ERROR: valeur différente de 0123456789

    ./monProg 5
    5

    Voici le code que j'ai écrit que j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #include <stdio.h>
     
    int main(int argc, char *argv[])
    {
    	int nbr=0;
    	int square=0;
            if (!(argc==2)){
    		printf("ERROR \n");
    		return 1;
    	}
    	else{
    		if(scanf("i%",&nbr)==1){
    		    square=nbr*nbr;
    			printf("\n", nbr);
    			printf("\n", square);
    			getchar();
    			return(0);
    		}
    		else{
    			printf("ERROR: valeur différente de 0123456789 \n");
    			return 1;
    		}
    	}
    }

    Le programme ne fonctionne pas. Je suppose que c'est à cause du test "if(scanf("i%",&nbr)==1)" car il y a la string monProg avant le nombre dans tous les cas. Il faudrait donc la passer pour faire tourner correctement le programme? Pouvez vous m'aider svp?

    Merci d'avance

    Jo

  2. #2
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    je pense qu'il faudrait tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sscanf(argv[1],"%d",&nbr)

  3. #3
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    petite remarque en passant
    est plus simple que

  4. #4
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 46
    Par défaut
    Je viens d'essayer ce que tu viens de me dire mais quand je lui rentre un entier, il me dit tjr que ce n'est pas bon. Il arrive au test mais me dit que je n'ai pas entré une valeur 0123etc.
    Pense tu que le problème viens de l'indice donné à argv[1] bien que ça me semble être 1? Mon test n'est peut être pas correct?

  5. #5
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    En fait, je crois que tu n'a pas bien compris le principe des formats pour les fonctions comme printf.

    Tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("\n", nbr);
    printf("\n", square);
    alors qu'il faut quand même préciser ce que tu veux afficher. Ici, ce sont des entiers, on met donc un "%d" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("%d\n", nbr);
    printf("%d\n", square);

  6. #6
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 46
    Par défaut
    je viens de le retester, j'avais fait une petite erreur mais un problème subsiste, quand j'acris 2.5 par exemple, il me le tronque en 2 alors que je voudrais qu'il me le passe en erreur. Comment m'y prendre?

  7. #7
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    En fait, dans l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sscanf(argv[1],"%d",&nbr)
    il cherche a lire un entier. Quand la chaine est "2.2", il lit bien un entier (le premier 2) et s'arrête après car le point ne peut faire partie d'un entier, c'est pourquoi il te renvoie 2 et ne fait pas d'erreur. Il faut donc faire en sorte que non seulement il lise un entier mais aussi qu'il s'assure qu'il n'y a qu'un entier et pas d'autres caractères.

  8. #8
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 46
    Par défaut
    et comment puis-je faire ceci? une idée?

  9. #9
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    Une solution serait de faire le test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ( sscanf(argv[1],"%d",&nbr) && (double)nbr==atof(argv[1]) )
    Mais ce n'est pas parfait, il refusera bien 2.5 mais acceptera 2.0.

  10. #10
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 46
    Par défaut
    je ne connais encore pas très bien le C et je ne sais pas ce que fait atof .
    L'idéal serait que si il trouve un truc différent d'un \n (quand on tape entrer en commander line argument, ça se traduit bien par un \n hein? à la suite de l'entier, il me mette l'erreur.

  11. #11
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    voila une solution.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int main(int argc, char *argv[]) {
    	int i, L, nbr=0;
    	int square=0;
     
    	if ( argc!=2) {
    		printf("ERROR\n");
    		return 1;
    	}
     
            L=strlen(argv[1]);
    	for (i=0;i<L;i++) {
    		if ( argv[1][i]!='\n' && (argv[1][i] < '0' || argv[1][i] > '9') ) {
    			printf("ERROR: valeur différente de 0123456789\n");
    			return 1;
    		}
    	}
     
    	nbr=(int)atof(argv[1]);
    	square = nbr * nbr;
    	printf("%d\n",nbr);
    	printf("%d\n",square);
     
    	return 1;
    }
    on test les caractères un par un et on vérifie que s'ils sont différents de "\n" ie du retour chariot, alors ils sont des chiffres.

  12. #12
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    atof transforme une chaine de caractères en un double. Si la transformation ne peut pas se faire, elle renvoie 0.0

  13. #13
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Personnellement, je trouve plus simple d'utiliser strtol() qui est faite pour cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(int argc, char *argv[])
    {
        int nbr = 0;
        int square = 0;
        char *pend = NULL;
     
        if (argc != 2)
        {
            fprintf(stderr, "ERROR\n");
            /* -tc- Les seules valeurs portable que peut retourner main() sont
               0, EXIT_SUCCESS ou EXIT_FAILURE */
            exit(EXIT_FAILURE);
        }
     
        nbr = strtol(argv[1], &pend, 0);
        if (*pend != 0)
        {
            fprintf(stderr, "ERROR\n");
            exit(EXIT_FAILURE);
        }
     
        square = nbr * nbr;
        printf("%d\n", nbr);
        printf("%d\n", square);
     
        return EXIT_SUCCESS;
    }

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  14. #14
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    Effectivement, c'est plus propre.

  15. #15
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 46
    Par défaut
    Merci pour votre aide, je me rends compte qu'il me reste vraiment beaucoup à apprendre... Surtout quand je vois les fonction que vous sortez et dont je n'ai aucune idée .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/05/2009, 14h36
  2. Problème pour passer un String en int
    Par Bouboukick dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 29/05/2008, 17h07
  3. Servlet: problème de conversion d'un string en INT
    Par keumlebarbare dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 28/11/2006, 10h44
  4. Réponses: 2
    Dernier message: 21/06/2004, 15h55
  5. [FLASH MX 2004] conversion string en int.
    Par calfater dans le forum Flash
    Réponses: 3
    Dernier message: 26/05/2004, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo