[DUDA] gets(cadena)

Iniciado por sinatra, 29 Septiembre 2012, 19:32 PM

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

sinatra

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 (cpp) [Seleccionar]
#include"iostream.h"
#include"stdio.h"

long convertir (char *string, long *intptr);

int main()
    {
    char string[10];
    long valor;
   
    printf("Ingrese digitos numericos:\n");
    printf("Termine digitando <<ENTER>>:\n");
    while(*gets(string)) {          //mientras el primer caracter que ingresaste es verdadero
        if(convertir(string, &valor))
            printf("Cadena %s convertida a entero: %ld\n", string, valor);
        else
            printf("Cadena %s no se puede convertir a entero\n", string);
        printf("\nIngrese digitos numericos: \n");
        printf("Termine digitando <<ENTER>>:\n");
        }
    return 0;
    }

long convertir(char *string, long *intptr)
    {
    int signo;
    *intptr=0;
    if(*string=='-' || *string=='+'){
        signo=(*string=='-')? -1: 1;
        string++;
        }
   
    while(*string>='0' && *string<='9'){
        *intptr=10*(*intptr)   +    (*string-'0');
        string++;
        }
       
    if(*string=='\0'){
        *intptr=signo *(*intptr);
        return 1;
        }
    else
        return 0;
    }


El problema esta resuelto correctamente, pero hace un momento no entendia que significaba:
Código (cpp) [Seleccionar]
*gets(string)
en la linea 13, pero mas o menos estudiando llegué a la Conclusión de que escribir:
Código (cpp) [Seleccionar]
while(*gets(string)) {
es equivalente a escribir:
Código (cpp) [Seleccionar]
gets(string);
cin.sync();
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 (cpp) [Seleccionar]
    gets(string);
    cin.sync();
    while(*string) {          //mientras el primer caracter que ingresaste es verdadero
        if(convertir(string, &valor))
            printf("Cadena %s convertida a entero: %ld\n", string, valor);
        else
            printf("Cadena %s no se puede convertir a entero\n", string);
        printf("\nIngrese digitos numericos: \n");
        printf("Termine digitando <<ENTER>>:\n");
        gets(string);
        cin.sync();
        }

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...

rir3760

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
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