En última instancia, sería más limpio para invertir en su lugar, así:
#include <stdio.h>
#include <string.h>
void
reverse(char *s)
{
int a, b, c;
for (b = 0, c = strlen(s) - 1; b < c; b++, c--) {
a = s[b];
s[b] = s[c];
s[c] = a;
}
return;
}
int main(void)
{
char string[] = "hello";
printf("%s\n", string);
reverse(string);
printf("%s\n", string);
return 0;
}
Su solución es esencialmente una versión semánticamente más grande de éste. Comprenda la diferencia entre un puntero y una matriz. El estándar establece explícitamente que el comportamiento de tal operación (modificación del contenido de un literal de cadena) no está definido. También debe ver this extracto de esquimal:
Al inicializar una matriz de caracteres con una constante de cadena:
char string[] = "Hello, world!";
se termina con una matriz que contiene la cadena, y se puede modificar el contenido de la matriz a su el contenido del corazón:
string[0] = 'J';
Sin embargo, es posible utilizar las constantes de cadena (el término formal es literales de cadena) en otros lugares en el código. Como son matrices, el compilador genera punteros a sus primeros elementos cuando se usan en expresiones, como de costumbre. Es decir, si usted dice
char *p1 = "Hello";
int len = strlen("world");
Es casi como si hubiera dicho
char internal_string_1[] = "Hello";
char internal_string_2[] = "world";
char *p1 = &internal_string_1[0];
int len = strlen(&internal_string_2[0]);
En este caso, las matrices nombrado internal_string_1 y internal_string_2 se supone que sugieren el hecho de que el compilador es en realidad la generación poca temporal arrays cada vez que use una constante de cadena en su código. Sin embargo, el hecho sutil es que las matrices que están `` detrás '' de las constantes de cadena no son necesariamente modificables. En particular, el compilador puede almacenarlos en memoria de solo lectura. Por lo tanto, si se escribe
char *p3 = "Hello, world!";
p3[0] = 'J';
su programa puede bloquearse, ya que puede tratar de almacenar un valor (en este caso, el carácter 'J') en la memoria nonwritable.
La moraleja es que cada vez que esté creando o modificando cadenas, debe asegurarse de que la memoria que está creando o modificando es editable.Esa memoria debe ser una matriz que haya asignado o alguna memoria que haya asignado dinámicamente mediante las técnicas que veremos en el próximo capítulo. Asegúrese de que ninguna parte de su programa intente alguna vez modificar una cadena que en realidad es una de las matrices no identificables y no nombradas que el compilador generó para usted en respuesta a una de sus constantes de cadena. (La única excepción es la inicialización de matriz, porque si escribe en dicha matriz, está escribiendo en la matriz, no en la cadena literal que utilizó para inicializar la matriz.) "
a pesar de que las personas que responden a su pregunta averigüé, Nunca se dice qué error que estaba recibiendo, o lo que no estaba funcionando! Siempre debe describir lo que esperaba y lo que realmente vio. (Salida incorrecta? Seg-fault/error GPF? Ciclo infinito/¿colgar?) – abelenky
Fue una segfault. Debería haberlo mencionado, gracias por el recordatorio. – qwer