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 :

Chaine de caractères contenant d'étranges caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 102
    Par défaut Chaine de caractères contenant d'étranges caractères
    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
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
     
    int main()
    {
     
    	int a=1;
    	int a2=33;
    	char str[512];
    	char str2[512];
    	int b;
    	char *c="aaaa";
    	char *c2="bbbb";
    	char d[5];
    	memmove(str,&a,4);
    	memmove(str+4,c,4);
    	strcpy(str2,str);
     
    	memset(str,0,strlen(str));
     
    /*
    	memmove(str,&a2,4);
    	memmove(str+4,c2,4);
    	strcat(str2,str);
    	*/
    	memmove(&b,str2,4);
    	memmove(d,str2+4,4);
    	printf("str2=%d\n",b);
    	printf("str2=%s\n",d);
     
    	memmove(&b,str,4);
    	memmove(d,str+4,4);
    	printf("str2=%d\n",b);
    	printf("str2=%s\n",d);
    /*
    	memcpy(&b,str2+8,4);
    	memcpy(d,str2+12,4);
    	printf("str2=%d\n",b);
    	printf("str2=%s\n",d);
    */
    }
    Bonjour , je comprend pas pour quoi str2 ne m'affiche pas la valeur de la chaine?
    voci le resultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    str2=1
    str2=¸ú(
    str2=0
    str2=aaaa
    pour quoi j'ai ce résultat : str2=¸ú(

  2. #2
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Salut,

    Visiblement, si cela ne t'affiche pas le résultat escompté, cela veut dire que là où il va copier ce que tu souhaites, il n'y a pas ce qu'il faut.

    En l’occurrence, la case mémoire d'adresse *dest+4 ne doit pas être correctement initialisée.

    Aussi, il me semble que ce genre de procédés est à bannir :
    char *var = "machaine";

    Back to basics, rien ne vaut un bon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *str2 = (char*)malloc( X*sizeof(char) );
    strcpy( str2, "v_initialisation");
    Dans ton cas, X vaut 4 (aaaa) +1 (\0) car il ne faut pas oublier '\0' qui est le caractère de contrôle de fin de chaine de caractères.

    Etant donné la nature de ta déclaration plutôt aléatoire, il est possible que str+4 ne corresponde pas du tout à ce que tu crois qu'il y est en mémoire à cet endroit. De cette, façon tu devrais pouvoir t'en assurer.

    Cordialement.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    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 496
    Billets dans le blog
    1
    Par défaut
    Aussi, il me semble que ce genre de procédés est à bannir :
    char *var = "machaine";
    Ca dépend. En fait, il faut mettre const char *var = "machaine"; pour corriger avec le message d'erreur que le compilateur sort si le const est absent : "warning: initialization discards qualifiers from pointer target type". En effet, "machaine" est une constante et est donc placer en mémoire constante. Ce n'est donc pas un espace qu'on peut modifier et donc essayer d'écrire à l'emplacement pointé par var provoque une erreur de segmentation. Si on souhaite y écrire, il faut en effet faire une allocation dynamique et copier "machaine" dans l'espace réservé.


    Pour ce qui est du reste du code original, je trouve que ça ressemble à un grand bazar : qu'essayes-tu de faire ?

  4. #4
    Membre expérimenté Avatar de fastdeath124
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Août 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur sécurité

    Informations forums :
    Inscription : Août 2011
    Messages : 117
    Par défaut
    Il y a dèjà un problème qui vient du fait d'appliquer la fonction memmove sur une source et une destination de types distincts sans tenir compte de la taille réelle de la copie. En effet, l'entier est codé sur 2 octets et le char est codé sur 1 octet. Dans votre cas, vous utilisez toujours la taille "4" alors que l'entier "a" par exemple est codé uniquement sur 2 octets. Par conséquent, vous copiez surement une valeur inconnue.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 496
    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 496
    Billets dans le blog
    1
    Par défaut
    Un int est codé sur 2 octets ? Je ne pense pas : un int est codé sur 4 octets , un short est codé sur 2 octets, en tout cas sur un processeur 32.

    L'erreur vient sûrement du problème expliqué par darkwall_37 : il y une copie de 4 octets, ce qui exclue \0 comme marqueur de fin de chaine. Les fonctions strcpy() et strlen() qui suivent s'arrêtent donc à un endroit aléatoire.

  6. #6
    Membre éclairé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Par défaut
    Il y a peut être une malheureuse combinaison des deux. Mais il est certain qu'un int peut contenir une valeur au dessus de 65535. 4 octets me semble mieux que 2.

  7. #7
    Membre expérimenté Avatar de fastdeath124
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Août 2011
    Messages
    117
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur sécurité

    Informations forums :
    Inscription : Août 2011
    Messages : 117
    Par défaut
    Oui vous avez raison, un int est codé sur 4 octets pour les processeurs 32 bits

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

Discussions similaires

  1. Comparer 2 chaines de caractère contenant des float
    Par Korben-Dallas dans le forum C
    Réponses: 14
    Dernier message: 17/05/2011, 13h26
  2. chaine de caractères contenant %s
    Par awalter1 dans le forum Général Python
    Réponses: 2
    Dernier message: 21/03/2011, 08h24
  3. Chaine de caractère, contenant des variables, à éxecuter
    Par kerozenium dans le forum Développement
    Réponses: 4
    Dernier message: 18/06/2010, 11h25
  4. Réponses: 3
    Dernier message: 12/07/2007, 14h11
  5. Réponses: 4
    Dernier message: 18/05/2006, 15h54

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