c
  • pointers
  • memory-management
  • 2017-10-10 15 views -3 likes 
    -3

    le code fonctionne il coupe le premier mot et le mettre, à la fin, le texte. Je ne comprends pas une ligne dans le code, disons que ma chaîne est "bonjour monde".c pointeurs et mémoire - compréhension

    lorsque j'utilise le code "* p ++ = '\ 0';"

    avant cette ligne: p: "world"

       s: "hello world" 
    

    après cette ligne: p: "world"

       s: "hello" 
    

    pourquoi at-il changé? et couper le mot monde?

    le code complet:

    void func(char *s) 
    { 
        char * p = strchr(s, ' '); 
        char * t = (char*)malloc(strlen(s) + 1); 
    
        if (!t) 
        { 
         printf("Memory allocated failed"); 
         exit(1); 
        } 
        *p++ = '\0'; 
        strcat(strcat(strcpy(t, p), " "), s); 
        strcpy(s, t); 
        free(t); 
    } 
    
    +1

    Vous devez vraiment être précis ici! Sinon, il n'y a aucun moyen de comprendre ce que vous voyez. Avant devrait être 'p:" monde "' (avec des espaces blancs!) – grek40

    +1

    Votre code est incomplet; en particulier, il semble manquer une fonction 'main()' et au moins un '# include'. S'il vous plaît [modifier] votre code c'est un [mcve] de votre problème, alors nous pouvons essayer de le reproduire et de le résoudre. Vous devriez aussi lire [ask]. –

    +0

    Veuillez lire et comprendre [la question sur pourquoi ne pas lancer la valeur de retour de 'malloc()' et de la famille dans C] (/ q/605845). –

    Répondre

    2

    Avant l'affectation à *p, vous avez les éléments suivants:

    +---+---+---+---+---+---+---+---+---+---+---+---+ 
    s: |'H'|'e'|'l'|'l'|'o'|' '|'W'|'o'|'r'|'l'|'d'| 0 | 
        +---+---+---+---+---+---+---+---+---+---+---+---+ 
             ^
        +---+     |   
    p: | | ----------------+ 
        +---+ 
    

    Après l'exécution de *p++ = '\0';, vous avez

    +---+---+---+---+---+---+---+---+---+---+---+---+ 
    s: |'H'|'e'|'l'|'l'|'o'| 0 |'W'|'o'|'r'|'l'|'d'| 0 | 
        +---+---+---+---+---+---+---+---+---+---+---+---+ 
              ^
        +---+      |   
    p: | | --------------------+ 
        +---+ 
    

    OIEau, vous ve a remplacé l'espace vide dans s avec un terminaison de chaîne, ce qui explique pourquoi vous ne voyez "Hello" lorsque vous imprimez s.

    +0

    Vous souhaitez ajouter le terminateur zéro après 'world'? – grek40

    +1

    @ grek40: Terminé. Je me suis réveillé quelques heures plus tôt que d'habitude, le cerveau n'est pas encore en train de fonctionner. –

    +0

    Cela ne fonctionne que pour une chaîne similaire à hello world qui contient un espace. – EsmaeelE

     Questions connexes

    • Aucun problème connexe^_^