Soy novato en C y estoy tratando de hacer alguna función para invertir una palabra, aquí mi código:
#include <stdlib.h> #include <string.h> // ƒ to revers the word void lettreCount(char *saisi, int length){ int i, j = 0; char revers[length]; for (i = length; i >= 0; --i){ //loop *(revers+j) = saisi[i]; ++j; } printf("%s\n",revers); } int main(){ char text[30]; //Array for text int len; printf("Saisissez le text:\n"); gets(text); len = strlen(text); lettreCount(text, len); }pero obtengo todo el tiempo solo una cadena vacía en la terminal, ¿cómo debo hacerlo? gracias
Las cadenas en C terminan con un byte nulo. Entonces, cuando comienza su ciclo con i = length el primer carácter que coloca en la nueva matriz es el byte nulo. Esto significa que tienes una cadena vacía.
Comience su ciclo en length-1 para que comience en el último carácter de la cadena. Luego, después del ciclo, deberá agregar manualmente el byte nulo de terminación a la matriz de destino.
char revers[length+1]; for (i = length-1; i >= 0; --i){ //loop *(revers+j) = saisi[i]; ++j; } revers[length] = 0;¿Nombra todas sus funciones como lettreCount independientemente de lo que estén haciendo? :)
conversión de puntero a entero incompatible strchr
Si una cadena s tiene caracteres de length (el valor devuelto por la función strlen ), la expresión s[length] produce el carácter cero final '\0' . El carácter cero final se escribe como el primer carácter de la nueva cadena en este ciclo for en su primera iteración
for (i = length; i >= 0; --i){ //loop *(revers+j) = saisi[i]; ++j; }Como resultado, la matriz de destino contiene una cadena vacía.
La función que crea una cadena invertida de una cadena dada se puede declarar y definir de la siguiente manera
char * copy_reverse( const char *s ) { size_t n = strlen( s ); char *reversed = malloc( n + 1 ); if ( reversed != NULL ) { reversed[n] = '\0'; for ( char *p = reversed + n; *s; ++s ) { *--p = *s; } } return reversed; }Lo primero que debe hacer es copiar el terminador nulo de la cadena en la primera posición de la matriz, por lo que es normal que se imprima como una cadena vacía.
void lettreCount(char *saisi, int length){ int i, j = 0; char revers[length]; for (i = length; i >= 0; --i){ //loop *(revers+j) = saisi[i]; El primer carácter que copia es saisi[length] --> revers[0] , por lo que coloca un '\0' al comienzo de su cadena.
void lettreCount(char *saisi, int length){ char revers[length]; int i = length, j = 0; while (--i >= 0) { //loop revers[j++] = saisi[i]; } /* you need to end the string */ revers[j] = '\0'; printf("%s\n",revers); }Su código corregido se muestra a continuación, ya que tiene algunos otros consejos en los comentarios:
#include <stdio.h> /* you need also this file to use fgets, gets or printf */ #include <stdlib.h> #include <string.h> // ƒ to revers the word void lettreCount(char *saisi, int length){ char revers[length]; int i = length, j = 0; while (--i >= 0) { //loop revers[j++] = saisi[i]; } /* you need to end the string */ revers[j] = '\0'; printf("%s\n",revers); } int main(){ char text[100]; //Array for text int len; printf("Saisissez le text:\n"); /* Don't use the obsolete gets, use fgets */ fgets(text, sizeof text, stdin); len = strlen(text); lettreCount(text, len); }