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 :

Comportement bizarre des chaînes de caractère


Sujet :

C

  1. #1
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut Comportement bizarre des chaînes de caractère
    Bonjour bonjour,

    J'ai un petit problème que je n'arrive pas à résoudre. Je fais une suite d'affectation de cette forme là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char* toto = malloc (10 * sizeof(char));
    toto = "blabla";
    toto = "haha";
    toto = "hihi"
    ...
    A priori, j'ai l'impression qu'au lieu de revenir à zéro, il me rajoute tout à la suite, genre "blablahahahihi". Pourtant, il me semble bien que toto <=> &toto[0]...
    Je vous met mon code :
    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
    void traduc_mot (char* chaine, pid_t pid)
    {
    	int i, t, lg_tab, sigcaract;
    	char* morse = malloc (11 * sizeof(char));
    	char one_char, one_by_one;
     
    	//Stockage dans lg_tab de la longueur de chaine
    	lg_tab = strlen(chaine);
     
    	// Acquisition caractere par caractere
    	for (i = 0; i < lg_tab; i++)
    	{
    		one_char = chaine[i];
     
    		// Table de transcodage carcatere -> caractere morsee
    		switch (one_char) {
    			case 'a': morse=".-";		break;
    			case 'b': morse="-...";		break;
    			case 'c': morse="-.-.";		break;
    			case 'd': morse="-..";		break;
                             /* beaucoup d'autre cas */
    			default: morse=".";		break;
    		}
    		for (t = 0; t < strlen(morse); t++)
    		{
    			one_by_one = morse[t];
    			switch (one_by_one) 
    			{
    				case '.': sigcaract = 16; break;
    				case '-': sigcaract = 17; break;
    			}
    			kill (pid, sigcaract);
    			pause();
    		}
    		kill (pid, 14);
    		pause();
    	}
    	kill (pid, 14);
    	pause();
    	free(morse);
    }
    Cette fonction est appelée dans une boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void traduc_phrase (char* chaine, pid_t pid)
    {
    	int i = 0;
    	char* pch = malloc (strlen(chaine) * sizeof(char));
    	printf("%d\n", strlen(chaine) * sizeof(char) + 1);
     
    	pch = strtok (chaine," ");/* On découpe la chaine du début jusqu'au premier espace*/
    	while (pch != NULL)
    	{
    		traduc_mot(pch, pid);/* On appelle traduc sur le bout de chaine*/
    		pch = strtok (NULL, " ");/* On redécoupe la chaine jusqu'au prochain espace */
    	}
    	free (pch);
    }
    Et dès que la phrase est trop longue (plus de 11 caractères), j'ai une segfault...

    Si vous pouviez éclairer ma lanterne, je vous en serez éternellement reconnaissant

    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  2. #2
    Membre averti

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Points : 354
    Points
    354
    Par défaut
    J'ai du mal à comprendre tous tes :
    Car je ne connais pas ces instructions systèmes... mais je dis pas qu'elles sont fausses loin de là.
    En fait je remarque un truc qui peut éventuellment faire bugger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char* morse = malloc (11 * sizeof(char));
    [...]
    for (t = 0; t < strlen(morse); t++)
    Tu as bien alloué ta chaine morse, mais nulle part je n'ai vu que tu l'initialises. Il n'est pas dit qu'il y ait un '0' comme marqueur de fin de chaine (Ceci, parfois c'est quand même le cas). Tu risques fort d'avoir un comportement indéterminé ici à mon avis !
    Pour le reste comme je le disais, j'ai du mal à comprendre ton programme car je connais tous les "PID" et autres...

  3. #3
    Membre éprouvé Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Points : 1 132
    Points
    1 132
    Par défaut
    Citation Envoyé par Woufeil Voir le message
    Bonjour bonjour,

    J'ai un petit problème que je n'arrive pas à résoudre. Je fais une suite d'affectation de cette forme là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char* toto = malloc (10 * sizeof(char));
    toto = "blabla";
    toto = "haha";
    toto = "hihi"
    ...
    Tu alloues un bloc mémoire sur lequel tu fais pointer 'toto', ce qui est gênant c'est que tu écrases la valeur de 'toto' avec tes affectations de "blabla" ...etc ton bloc mémoire est donc perdu, tu ne peux plus le récupérer.

    EDIT: Après un rapide coup d'oeil sur ton code je pense que tes malloc/free ne servent à rien.
    To start press any key. (reading screen) Where's the "any" key? I see Esc, Catarl, and Pig Up. There doesn't seem to be any "any" key. Wo! All this computer hacking is making me thirsty. I think I'll order a Tab. (presses TAB key). -- HOMER --

  4. #4
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Citation Envoyé par ssmario2 Voir le message
    Tu alloues un bloc mémoire sur lequel tu fais pointer 'toto', ce qui est gênant c'est que tu écrases la valeur de 'toto' avec tes affectations de "blabla" ...etc ton bloc mémoire est donc perdu, tu ne peux plus le récupérer.

    EDIT: Après un rapide coup d'oeil sur ton code je pense que tes malloc/free ne servent à rien.
    Effectivement, je suis un boulet... J'ai mis un strcpy et ça fonctionne...

    Merci, et désolé pour la question boulet
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

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

Discussions similaires

  1. [VBS]Gestion des chaînes de caractères
    Par Edoxituz dans le forum VBScript
    Réponses: 11
    Dernier message: 29/01/2006, 17h07
  2. Gestion des chaînes de caractères
    Par Furius dans le forum VBScript
    Réponses: 5
    Dernier message: 06/01/2006, 15h01
  3. Problème sur des chaînes de caractères
    Par Anonymous dans le forum Access
    Réponses: 9
    Dernier message: 16/09/2005, 08h21
  4. Passage des chaînes de caractères à une application CGI
    Par Thom@s dans le forum Composants VCL
    Réponses: 10
    Dernier message: 03/12/2004, 00h13

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