-1
votes

Quel est le problème avec mon code? Il dit faute de segmentation

Ce que j'essaie de faire est de faire le message de l'entrée de l'utilisateur et d'inverser la chaîne. Donc, j'utilise 2 pointeurs, on pointe au premier élément du tableau de messages et l'autre pointe vers le dernier élément. Et puis je fais le swap jusqu'à ce que les deux pointeurs se rencontrent.

#include <stdio.h>
#include <string.h>
void reverse(char* message);
    int main()
    {
        char message[100];

        printf("Enter a message: ");
        scanf("%s",message);
        printf("\nok");
        reverse(message);
        printf("ok \n");
        printf("%s",message);

        return 0;
    }

    void reverse(char* message){

        char* p = message;
        char* temp = message;
        char* q = (message + (strlen(message)); // pointing to the last element before 
                                             // null character

        printf("\ncoming");
        while( p != q){

                                  // why am I getting a segmentation fault? whats happening?
            *p = *q;
            *q = *temp;

            p++;
            q--;
            temp = p;  

        }// while loop
    }// reverse

c

7 commentaires

Regardez de près comment vous échangez les personnages. En outre, S + SHLEN (s) ne pointe pas le dernier caractère avant le TEMMINATEUR NULL, comme le revendique le commentaire. Il pointe juste au niveau de la terminaison NULL.


Avec les deux p ++ et q - le moment test p! = Q peut être toujours vrai (boucle infinie). Pouvez-vous voir dans quel cas cela peut se produire (Supposons P et Q Pointes 2 caractères consécutifs, ce qui se produira après p ++ et q - ? Que se passera-t-il si le tandis que boucle ne finit jamais (où allez p et q )? Notez également que l'échange n'est pas correct. Vous avez besoin d'un TEMP variable de type char .


Pensez à cette chaîne xy . Ici, votre p ne sera jamais égal à q et la boucle ne s'arrête pas, c'est ce qui a provoqué la défaillance de la segmentation.


J'ai réparé la condition de boucle tandis que. Maintenant, j'ai donné tandis que (p


Lors de la compilation, activez toujours les avertissements, puis fixez ces avertissements. (Pour GCC , à une utilisation minimale: -wall -wextra -wonversion -peantique -peal -std = gnu11 ) Remarque: D'autres compilateurs utilisent différentes options pour produire les mêmes résultats.


OT: concernant: scanf ("% s", message); 1) Lorsque vous utilisez le % s et / ou le % [...] Les spécificateurs de format, incluent toujours un modificateur de caractères max qui est inférieur à la longueur de la mémoire tampon d'entrée, car ces spécificateurs de format soulèvent toujours un octet nul à l'entrée. Cela évite de débordement tampon et du comportement non défini résultant 2) Vérifiez toujours la valeur renvoyée (pas les valeurs de paramètre) pour assurer que l'opération a été réussie. Remarque: ces fonctions renvoient le nombre d'opérations de conversion de format réussi (toute autre valeur renvoyée indique une erreur survenue.


Concernant: Char * q = (message + (Strlen (message)); Il manque une paren de fermeture juste avant le ;


4 Réponses :


0
votes

Concernant:

p++;
q--;


0 commentaires

-1
votes

a défaut de segmentation est causé par un programme essayer de lire ou d'écrire un emplacement de mémoire illégal. Avec les deux p ++ et q - le tandis que (p! = Q) peut être toujours vrai, par exemple si p et q point à 2 caractères consécutifs. Vérifiez cette approche pour l'inverser des chaînes: xxx


0 commentaires

0
votes

j'ai corrigé la condition de boucle tandis que. Maintenant, j'ai donné alors que (P

Les deux pointeurs p et TEMP pointe sur < Code> Message : char * p = message; char * temp = message;

lorsque * p = * q; est exécuté dans la boucle tandis que "P" " > Et le caractère pointé par "Temp" , obtenez-vous à jour avec le caractère de "Q" (en raison des déclarations ci-dessus). La ligne suivante * q = * temp; copie essentiellement le caractère nouvellement mis à jour ("* q") retour sur "q".

en plus, comme indiqué par " M oehm ", la ligne Message + Strlen (message) , points sur le caractère NULL, au lieu du dernier caractère avant NULL.

Notez également le commentaire Publié par "user3629249" concernant les parenthèses manquantes. < / p>

Correction de ceux-ci, votre code devrait ressembler à ... xxx

ayant dit cela, car "c" passe des paramètres par valeur, vous pouvez implémenter la même fonction. , comme si .... xxx


0 commentaires

1
votes

Cette ligne xxx pré>

indique-t-il sur le dernier caractère. p>

Considérez un message d'un caractère - SHLEN (message) code> par un. Mais le premier caractère serait char * q = message code> p>

de sorte que la ligne doit être lue p> xxx pré>

aussi le swap est un Soyez AWRY P>

ESSAYE P>

while( p < q){


0 commentaires