elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [DUDA] gets(cadena)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [DUDA] gets(cadena)  (Leído 1,680 veces)
sinatra

Desconectado Desconectado

Mensajes: 4



Ver Perfil
[DUDA] gets(cadena)
« en: 29 Septiembre 2012, 19:32 pm »

Hola amigos, tengo una duda con el siguiente programa:

El problema propuesto es el siguinte:

Realizar un programa que tenga una funcion para convertir una cadena de caracteres numericos a un numero entero. Donde:
   -  La entrada debe ser un puntero a cadena de caracteres
   -  La salida tendrá dos parametros:
         1. El primero será un puntero a entero que tomará el valor de la conversion a entero.
         2. El segundo será el valor retornado por la funcion y tomará los siquientes valores:
                1 si la cadena se compone exclusivamemte de caracteres numéricos precedidos de un signo menos o un signo
                   más (aunque no necesariamente).
                0 si lo anterio no se cumple, en este caso envia un aviso de error.

El problema lo encontré ya resuelto y es el siguiente:

Código
  1. #include"iostream.h"
  2. #include"stdio.h"
  3.  
  4. long convertir (char *string, long *intptr);
  5.  
  6. int main()
  7.    {
  8.    char string[10];
  9.    long valor;
  10.  
  11.    printf("Ingrese digitos numericos:\n");
  12.    printf("Termine digitando <<ENTER>>:\n");
  13.    while(*gets(string)) {          //mientras el primer caracter que ingresaste es verdadero
  14.        if(convertir(string, &valor))
  15.            printf("Cadena %s convertida a entero: %ld\n", string, valor);
  16.        else
  17.            printf("Cadena %s no se puede convertir a entero\n", string);
  18.        printf("\nIngrese digitos numericos: \n");
  19.        printf("Termine digitando <<ENTER>>:\n");
  20.        }
  21.    return 0;
  22.    }
  23.  
  24. long convertir(char *string, long *intptr)
  25.    {
  26.    int signo;
  27.    *intptr=0;
  28.    if(*string=='-' || *string=='+'){
  29.        signo=(*string=='-')? -1: 1;
  30.        string++;
  31.        }
  32.  
  33.    while(*string>='0' && *string<='9'){
  34.        *intptr=10*(*intptr)   +    (*string-'0');
  35.        string++;
  36.        }
  37.  
  38.    if(*string=='\0'){
  39.        *intptr=signo *(*intptr);
  40.        return 1;
  41.        }
  42.    else
  43.        return 0;
  44.    }
  45.  

El problema esta resuelto correctamente, pero hace un momento no entendia que significaba:
Código
  1. *gets(string)
en la linea 13, pero mas o menos estudiando llegué a la Conclusión de que escribir:
Código
  1. while(*gets(string)) {
es equivalente a escribir:
Código
  1. gets(string);
  2. cin.sync();
  3. while(*string) {                   //donde *string es equivalente a string[0]
entonces me propuse reemplazar el codigo de la linea 13 a la linea 20 del programa resualto por el siguiente codigo:
Código
  1.    gets(string);
  2.    cin.sync();
  3.    while(*string) {          //mientras el primer caracter que ingresaste es verdadero
  4.        if(convertir(string, &valor))
  5.            printf("Cadena %s convertida a entero: %ld\n", string, valor);
  6.        else
  7.            printf("Cadena %s no se puede convertir a entero\n", string);
  8.        printf("\nIngrese digitos numericos: \n");
  9.        printf("Termine digitando <<ENTER>>:\n");
  10.        gets(string);
  11.        cin.sync();
  12.        }
La variable *intptr dentro la funcion convertir() apunta a la variable valor de la funcion main().
En la funcion convertir(), *intptr toma el valor de la cadena de caracteres numericos convertida a entero, y ya que ésta apunta a la variable valor, esta ultima almacena el valor de *intptr, pero al reemplazar el segmento de codigo la variable valor no almacena el valor de *intptr sino que queda con un valor de 0, y con este valor el programa no muestra el resultado que se desea en la proposicion del problema.

Mi duda esta misma; no comprendo por que sucede esto. Cosas como estas son las que no me dejan dormir tranquilo, porque el programa no hace lo que yo intento que haga, que es de lo que se trata esto.

Les agradezco mucho por sus respuestas

NOTA 1: no busco una alternativa para el problema, ya que como ven, el programa ya esta resuelto, entonces pues no me interesa resolverlo, mas bien quiero entender porque sucede esto.

NOTA 2: al fin estoy entendiendo lo importante que son los sitios como estos.

Saludos...


En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: [DUDA] gets(cadena)
« Respuesta #1 en: 30 Septiembre 2012, 03:40 am »

Primero la pedanteria: no se recomienda el uso de "gets", las razones se describen en el tema |Lo que no hay que hacer en C/C++. Nivel basico|.

En cuanto a tu programa lo mejor es que publiques su código fuente completo.

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda con conversion de número a cadena y trabajo con esta
Programación Visual Basic
_LooSeR_ 0 1,096 Último mensaje 19 Marzo 2008, 03:20 am
por _LooSeR_
[C#] Duda cadena de conexion « 1 2 »
.NET (C#, VB.NET, ASP)
SRVAM 15 12,341 Último mensaje 21 Enero 2010, 21:56 pm
por SRVAM
[DUDA C] Dividir cadena en subcadenas (similar argv)
Programación C/C++
setwarn 2 7,733 Último mensaje 6 Diciembre 2010, 18:01 pm
por setwarn
Duda de cadena de caracteres en C « 1 2 »
Programación C/C++
Ixcal 13 6,303 Último mensaje 28 Septiembre 2012, 23:05 pm
por leosansan
Duda con la matriz de cadena en C.
Programación C/C++
orehmu 1 1,839 Último mensaje 1 Abril 2015, 05:12 am
por rir3760
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines