Frase sin espacios al principio ni al final en lenguaje C.

Iniciado por NOB2014, 27 Enero 2017, 21:35 PM

0 Miembros y 1 Visitante están viendo este tema.

NOB2014

Hola, saludos para todos.
El código que dejo a continuación es para validar que al ingresar el nombre y apellido de un alumno sea correcto.
Por el momento lo que verifico es:
Que tmp no quede vacío, si se pulsa <Enter> sin ingresar nada o si se se pulsa <Enter> después de pulsar <Espacio> una o varias veces. -
No debe haber espacios ni al principio ni al final de la frase ingresada. -
CitarSi ingreso "  Roberto"  debería devolver "Roberto"
Si ingreso "  Roberto  "  debería devolver "Roberto"
Si ingreso "Roberto  "  debería devolver "Roberto"
El problema lo tengo con poner el final de cadena '\0' después del último carácter, si no hay
espacios en blanco fgets lo deja perfecto pero que pasa si el ingreso es:
[0] R
[1] o
[2] b
[3] e
[4] r
[5] t
[6] o
[7]
[8]
[9] '\0'
Concretamente como harían para pasar el elemento [9] al [7]

#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>     

void get_String( char *tmp );
void ajustes( char *tmp );
void mensajeError();
     
int main( void ){
char tmp[30];      

get_String( tmp );

return EXIT_SUCCESS;
}
     
void get_String( char *tmp ){
int ok, i=0, espacios=0, espIzquierda=0;

do{
ok=1;
printf("\n Ingresa el nombre completo del alumno ......:" );
fgets( tmp, 30, stdin );
ajustes( tmp );
while( tmp[i] != '\0' ){
if( tmp[i] == 32 ){
espacios++;
}else{
if( tmp[0] == 32 && espIzquierda == 0 ){
espIzquierda = i;
}
}
i++;
}
if( i == espacios ){
ok=0; espacios=0; i=0;
mensajeError();
}
}while( !ok );
if( espIzquierda > 0 ){
i=0;
while( tmp[i] != '\0' ){
tmp[i] = tmp[i+espIzquierda];
i++;
}
}
}

void ajustes( char *tmp ){
        char *p = NULL;
        int ch;

        if(( p=strchr( tmp , '\n'))){
                *p='\0';
        }else{
                while((ch = getchar()) !='\n' && ch!=EOF);
        }
}

void mensajeError(){
printf( "\n El dato es obligatorio" );
printf( "\n\t Pulsa <Enter> para intentarlo nuevamente..." ); getchar();
}


Por favor, no hacer caso a las librerías incluidas que es por tantas practicas. -

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

ivancea96


NOB2014

Hola, Ivan.
No entiendo tu código, en mi ej. cuando salga del bucle no vale 7 vale 9 . -
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

ivancea96

Lo que tratas de hacer es un trim. El tema es recorrer la cadena desde el final hacia atras hasta encontrar un caracter que no sea espacio (índice i). Luego, pones el '\0' en (i+1). Y lo mismo desde el principio.

Cita de: NOB2014 en 28 Enero 2017, 00:13 AM
Hola, Ivan.
No entiendo tu código, en mi ej. cuando salga del bucle no vale 7 vale 9 . -
Ese 7 lo tienes que calcular, como puse arriba.

NOB2014

Ahora me queda claro y dejo como lo hice por si alguien tiene la misma duda que tenía yo. -

j=i-1;
while( j >= 0 ){
if( isalpha(tmp[j])){
tmp[j+1] = '\0';
break;
}
j--;
}


Seguramente alguien tendrá una versión mejor, si desea postearla todos los que estamos aprendiendo muy agradecidos. -

Saludos.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-