Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NOB2014 en 27 Enero 2017, 21:35 pm



Título: Frase sin espacios al principio ni al final en lenguaje C.
Publicado por: NOB2014 en 27 Enero 2017, 21:35 pm
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. -
Citar
Si 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:
Código
  1. [0] R
  2. [1] o
  3. [2] b
  4. [3] e
  5. [4] r
  6. [5] t
  7. [6] o
  8. [7]
  9. [8]
  10. [9] '\0'
  11.  
Concretamente como harían para pasar el elemento [9] al [7]

Código
  1. #include <stdio.h>
  2. #include <limits.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <ctype.h>    
  6.  
  7. void get_String( char *tmp );
  8. void ajustes( char *tmp );
  9. void mensajeError();
  10.  
  11. int main( void ){
  12. char tmp[30];    
  13.  
  14. get_String( tmp );
  15.  
  16. return EXIT_SUCCESS;
  17. }
  18.  
  19. void get_String( char *tmp ){
  20. int ok, i=0, espacios=0, espIzquierda=0;
  21.  
  22. do{
  23. ok=1;
  24. printf("\n Ingresa el nombre completo del alumno ......:" );
  25. fgets( tmp, 30, stdin );
  26. ajustes( tmp );
  27. while( tmp[i] != '\0' ){
  28. if( tmp[i] == 32 ){
  29. espacios++;
  30. }else{
  31. if( tmp[0] == 32 && espIzquierda == 0 ){
  32. espIzquierda = i;
  33. }
  34. }
  35. i++;
  36. }
  37. if( i == espacios ){
  38. ok=0; espacios=0; i=0;
  39. mensajeError();
  40. }
  41. }while( !ok );
  42. if( espIzquierda > 0 ){
  43. i=0;
  44. while( tmp[i] != '\0' ){
  45. tmp[i] = tmp[i+espIzquierda];
  46. i++;
  47. }
  48. }
  49. }
  50.  
  51. void ajustes( char *tmp ){
  52.        char *p = NULL;
  53.        int ch;
  54.  
  55.        if(( p=strchr( tmp , '\n'))){
  56.                *p='\0';
  57.        }else{
  58.                while((ch = getchar()) !='\n' && ch!=EOF);
  59.        }
  60. }
  61.  
  62. void mensajeError(){
  63. printf( "\n El dato es obligatorio" );
  64. printf( "\n\t Pulsa <Enter> para intentarlo nuevamente..." ); getchar();
  65. }

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

Saludos.


Título: Re: Frase sin espacios al principio ni al final en lenguaje C.
Publicado por: ivancea96 en 27 Enero 2017, 22:46 pm
Código
  1. tmp[i] = '\0'; // tmp[7] = '\0';
What else?


Título: Re: Frase sin espacios al principio ni al final en lenguaje C.
Publicado por: 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 . -


Título: Re: Frase sin espacios al principio ni al final en lenguaje C.
Publicado por: ivancea96 en 28 Enero 2017, 00:24 am
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.

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.


Título: Re: Frase sin espacios al principio ni al final en lenguaje C.
Publicado por: NOB2014 en 28 Enero 2017, 03:18 am
Ahora me queda claro y dejo como lo hice por si alguien tiene la misma duda que tenía yo. -

Código
  1. j=i-1;
  2. while( j >= 0 ){
  3. if( isalpha(tmp[j])){
  4. tmp[j+1] = '\0';
  5. break;
  6. }
  7. j--;
  8. }

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

Saludos.