2011-01-24 2 views
0

J'essaie d'apprendre les principes fondamentaux de C, mais je n'arrive pas à comprendre pourquoi ce code ne fonctionne pas. La boucle while de reverse() provoque une erreur de bus. J'ai trouvé le code presque identique dans un livre d'entrevue de programmation comme une solution valide, mais ni cette méthode ni d'autres méthodes similaires que j'ai vu posté ici ne fonctionnent pour moi sans une erreur de bus.In-Place String Inverser en C

#include <stdio.h> 

void reverse(char* str) { 
char* end = str; 
char tmp = 0; 
if(str) { 
    while(*end) { 
    end++; 
    } 
    --end; 
    while(end>str) { 
    tmp = *end; 
    *end-- = *str; 
    *str++ = tmp; 
    } 
} 
} 

int main() { 
char* a = "12"; 
puts(a); 
reverse(a); 
puts(a); 

return 0; 
} 
+1

Voir http://stackoverflow.com/questions/4493139/are-string-literals-const et beaucoup d'autres questions (comme au moins une fois par semaine) sur le SO. – ephemient

Répondre

4

Le problème est que vous essayez d'inverser une chaîne littérale constante, qui est en lecture seule. Changez la déclaration de a en main en char a[] = "12"; pour en faire un tableau caractère modifiable à la place

+0

Merci! Cela aide beaucoup. – Tiki

2

Vous essayez de modifier un littéral de chaîne qui conduit à un comportement indéfini.

changement

char* a = "12"; 

à

char a[] = "12"; 
+0

Wow, merci beaucoup! – Tiki

-2

Parce que end et str pointent vers le même emplacement mémoire -> ils sont deux noms différents du même objet. Vous pouvez éviter d'utiliser deux variables:

char foo[20] = "abcdefghi", tmp; 
int counter = 0, length = strlen(foo); 

for(counter, counter < length/2; counter++) { 
    tmp = foo[counter]; 
    foo[counter] = foo[length - counter]; 
    foo[length - counter] = tmp; 
} 
+0

"objet"? C'est C! (Quoiqu'il en soit, 'end' et' str' pointent seulement vers le même emplacement pour quelques lignes de code.) – ladenedge

+0

Il manque le point de la reverse in situ: Utilisez deux pointeurs qui fonctionnent dans le tampon de chaîne. Des choses de bas niveau, bien sûr; mais il devrait être efficace et rapide. – winwaed

+1

@ladenedge: "Objet" est le mot correct utilisé dans la norme de langage C. –