Invertir una cadena de caracteres de entrada

Me gustaría invertir una cadena de caracteres de entrada y uso el puntero que apunta al último carácter y hace que imprima la cadena mientras la dirección del puntero disminuye. Sin embargo, no pude conseguir toda la cadena. ¿Alguien podría decirme qué está mal?

//Reverse a charater string #include int main() { char a[50]; int l; int *p; printf("Please input a character string:\n"); scanf("%s",a); l = strlen(a); for (p = &a[l-1]; p >= a; p--) { printf("%c",*p); } printf("\n"); return 0; } Output: Please input a character string: asdfasdfasdf fff 

El problema es el uso del tipo int para *p .

Como un int es de 32 bits de ancho (cuatro veces más grande que un char), cuando el puntero disminuye, se imprime cada cuatro caracteres en el reverso de la cadena.

Entonces, con su cadena de muestra, asdfasdfasdf , el puntero apunta a la última f , luego a la f media, luego a la primera f .

Ejemplo similar:

 Please input a character string: abcdefghijklmno l is 15, a[l-1] is o okgc Press any key to continue . . . 

Si cambia el puntero al tipo char , disminuirá correctamente, apuntando a todos los caracteres de la cadena en orden inverso.

Has declarado p como puntero entero. Debe ser un puntero de char.

 int *p; 

debiera ser

 char *p; 

Cuando incrementas / decrementas un puntero de tipo T* , la dirección contenida en él cambia por sizeof(T) . Como ha declarado que p es int* , la dirección del puntero cambia por sizeof(int) . En su máquina sizeof(int) == 4*sizeof(char) , explique el resultado que ve. Cambia el tipo de p a char* .