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
4 Réponses :
Concernant:
p++; q--;
a défaut de segmentation em> est causé par un programme essayer de lire ou d'écrire un emplacement de mémoire illégal. Avec les deux p ++ code> et q - code> le tandis que (p! = Q) code> peut être toujours vrai, par exemple si p code> et q code> point à 2 caractères consécutifs. Vérifiez cette approche pour l'inverser des chaînes:
j'ai corrigé la condition de boucle tandis que. Maintenant, j'ai donné alors que (P Les deux pointeurs lorsque en plus, comme indiqué par " M oehm ", la ligne
Notez également le commentaire Publié par "user3629249" concernant les parenthèses manquantes. < / p> Correction de ceux-ci, votre code devrait ressembler à ... p> ayant dit cela, car "c" passe des paramètres par valeur, vous pouvez implémenter la même fonction. , comme si .... p>
p code> et TEMP code> pointe sur < Code> Message Code>:
char * p = message; code>
char * temp = message; code> p> * p = * q; code> est exécuté dans la boucle tandis que "P" " > Et le caractère pointé par "Temp" forte>, obtenez-vous à jour avec le caractère de "Q" (en raison des déclarations ci-dessus).
La ligne suivante * q = * temp; code> copie essentiellement le caractère nouvellement mis à jour ("* q") retour sur "q". P> Message + Strlen (message) CODE>, points sur le caractère NULL, au lieu du dernier caractère avant NULL. p>
Cette ligne indique-t-il sur le dernier caractère. p> Considérez un message d'un caractère - de sorte que la ligne doit être lue p> aussi le swap est un Soyez AWRY P> ESSAYE P> SHLEN (message) code> par un. Mais le premier caractère serait char * q = message code> p> while( p < q){
Regardez de près comment vous échangez les personnages. En outre,
S + SHLEN (s) code> 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 ++ code> etq - code> le moment testp! = Q code> 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èsp ++ code> etq - code>? Que se passera-t-il si letandis que code> boucle ne finit jamais (où allezp code> etq code>)? Notez également que l'échange n'est pas correct. Vous avez besoin d'unTEMP Code> variable de typechar code>.Pensez à cette chaîne
xy code>. Ici, votrep code> ne sera jamais égal àq code> 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