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 :

incrémenter une chaine de caractères en binaire ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Collégien
    Inscrit en
    Mai 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 116
    Par défaut incrémenter une chaine de caractères en binaire ?
    Salut,
    je dispose d'une chaine de caractère de trente "0"
    et je souhaite l'incrémenter en binaire ( 000000....001/ 0000000...010 etc ....) à chaque fin de ma boucle,
    et j'aimerai savoir comment faire si c'est possible sans convertir la chaine en int puis en binaire etc ...

    merci d'avance.

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Je m'avance peut-être mais je crois que tu ne maitrises pas totalement le stockage des données en C. Une chaine de caractères n'est rien d'autre qu'un "tableau" (allocation statique avec char[] ou dynamique avec malloc() ) d'objet de type char. Un char est en fait un entier de taille 8 bits.

    La phrase
    sans convertir la chaine en int puis en binaire
    n'a donc pas vraiment de sens, la chaine de caractère est toujours en int (mais un très petit int) et toujours en binaire.

    L'éventuelle "conversion" est en fait la manière de l'afficher avec un printf :
    • %c pour l'interpréter comme une lettre ASCII
    • %d pour l'interpréter comme un nombre décimal
    • %x pour l'interpréter en hexa


    Ceci étant dit, pour revenir au problème, il te suffit grosso modo :
    1. de déclarer un tableau et l'initialiser à zéro
    2. faire une boucle sur une variable i et à chaque itération
    3. de mettre le i-eme élément à 1
    4. et mettre le i-1-ieme à 0


    Bon courage

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Quelque chose dans le genre :
    Partir du char de poids faible en allant vers celui de poids fort tant qu'on trouve des char à '1' et mettre ces char à '0', enfin mettre le suivant (qui est donc à '0') à '1'
    Par exemple :
    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
    #include <string.h>
    #include <stdio.h>
     
    int incremente( char* nombre, int len)
    {
         char *p;
         int ovf;
         for(p=nombre+len-1; p>nombre && *p=='1' ;p--) *p = '0';
         ovf =  p == nombre && *p == '1' ;
         *p =  ovf ? '0' :'1';
         return !ovf;
    }
    int main(void)
    {
       char nombre[] = "0000";
       int len = strlen(nombre) ;
       printf("%s\n", nombre);
       while (incremente(nombre,len) )printf("%s\n", nombre);
       printf("Overflow %s \n", nombre);
       return 0;
    }

  4. #4
    Membre expérimenté
    Homme Profil pro
    Collégien
    Inscrit en
    Mai 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 116
    Par défaut
    merci de votre aide, mais finalement j'y suis allé en mode barbare,

    voilà ce que j'ai fait si ca peut intéresser des gens dans le futur:


    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    char ch[30]="000000000000000000000000000000";
    int che[30];
    char chi[1]="";
     
    int i=0;
    int n;
    int j=0;
     
     
    int main (void) {
     
      n=atoi(ch);
     
     
    n=n+1;
     
     
     
    while((i<30)){
     
    j=n%2;
     
    	n=n/2;
     
     
    che[i]=j;
    printf("%d", che[29-i]);
     
    sprintf(chi,"%d",che[29-i]);
     
    ch[i]=chi[0];
     
     
    i++;
    }
     
    printf("\n%s",ch);
    return 0;
       }

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Ton code est faux.
    - Les tableaux sont trop petits, tu as oublié de compter le 0 terminal des chaines.
    - le résultat n'est pas toujours juste : ça marche si on part de 0....00 ou 0....01, mais pas ensuite : 0....0010 -> 0....1011

  6. #6
    Membre expérimenté
    Homme Profil pro
    Collégien
    Inscrit en
    Mai 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2012
    Messages : 116
    Par défaut
    salut, j'ai refait le programme pour qu'il marche avec tout, mais ca bloque a la valeur 16385 après ca ne marche plus

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    char ch[31]="000000000000000000000000000000";
    int che[31];
    char chi[2]="";
     
    int i=0;
    int n=0;
    double j=0;
     
     
     
    int main (void) {
     int nb;
     char e;
    int z = 30;
    int db=0;
    int k=0;
     
     
     
    n=atoi(ch);
     
     
    //convertion binaire decimale
    while(z>0)
    {
    	e=ch[z-1];
    	printf("--%c-- ",e);
     
    	if(e=='0')
    	{
    		nb=0;
     
    	}
    	else{
     
    		nb=1;
    	}
     
     
    		k=30-z;
    		printf("===%d===", k);
    		if(nb==1){
    		db=db+pow(2,k);
    	}
     
     
    	z--;	
    }
     
    printf("((((((avant %d))))))",db);
     
     
    // convertion decimale binaire 
     
     
    db=db+1; // incrémentation du nbre décimal
     
    printf("((((((après %d))))))",db);
     
    while((i<30)){
     
    j=db%2;
     
     
    	db=db/2;
     
    printf("....%d.....", db);
    che[i]=j;
    printf("%d", che[29-i]);
     
     
    sprintf(chi,"%d",che[29-i]);
     
    ch[i]=chi[0];
     
     
    i++;
    }
    i=0;
    printf("\n%s",ch);
     
     
     
    return 0;
       }

Discussions similaires

  1. incrémenter une chaine de caractère
    Par manaliac dans le forum Fortran
    Réponses: 7
    Dernier message: 04/06/2010, 16h52
  2. Incrémenter une chaine de caractères
    Par moukit233 dans le forum Langage
    Réponses: 10
    Dernier message: 11/12/2009, 15h22
  3. Réponses: 5
    Dernier message: 26/08/2008, 16h00
  4. Réponses: 7
    Dernier message: 25/04/2008, 22h36
  5. Réponses: 10
    Dernier message: 11/01/2007, 08h54

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