Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: seryioo en 18 Agosto 2015, 19:38 PM

Título: Pasar una cadena de caracteres a int. C++
Publicado por: seryioo en 18 Agosto 2015, 19:38 PM
Buenas a todos, aquí sigo, peleando con las cadenas de caracteres.
Veréis, se me plantea el siguiente ejercicio: (no puedo usar ninguna función predefinida que haga el trabajo de cadena_a_int)

Código (cpp) [Seleccionar]
/*15) Función para producir el valor numérico correspondiente a una cadena de dígitos; p.e.
para la cadena "-234" debe producir el número -234. La función comprobará si todos los
caracteres son dígitos y devolverá el parámetro ok a true o false según haya podido
producir el valor o no.
void cadena_a_int(const TCadena cad, int& num, bool& ok)*/


Pero el programa que he escrito no me funciona, no se por qué, agrego al código explicando algunas cosillas con comentarios a ver si veis lo que pasa.

Código (cpp) [Seleccionar]
#include <iostream>
#include <cmath>
using namespace std;

typedef char TCadena[];

//---------------------------

void cadena_a_int(const TCadena cad, int& num, bool& ok);

int  longitud (const TCadena cad);

//---------------------------

int main (){
   int num=0;
   char cad[]={99};
   bool ok;
   cadena_a_int(cad, num, ok);
   cout<<num;

   return 0;
}

//---------------------------

void cadena_a_int(const TCadena cad, int& num, bool& ok){
   int  pos=longitud(cad)-1;
   int i=0;
   ok=true;
   bool error=false;           //CONTROLA MAS ADELANTE QUE SE ENCUENTRE ALGUN CARACTER QUE NO SEA NUMERO
   bool negativo=false;           //CONTROLA MAS ADELANTE QUE SI HEMOS ENCONTRADO EN PRIMER LUGAR UN '-' SE MULTIPLIQUE NUM*-1
   if(cad[0]=='-') negativo=true;           //CONTROL PARA NUMEROS NEGATIVOS
   while(cad[pos]>=0 && !error){           //MIENTRAS LA POSICION ES MAYOR O IGUAL QUE 0 Y NO HAY ERROR
       if(cad[pos]>=0 && cad[pos]<=9){           //SI LO QUE TENEMOS ES UN NUMERO, ENTONCES NUM+X*10^i= NUM
           num+=cad[pos]*pow(10,i);
           cout<<cad[pos];           //ESTOY COMPROBANDO SI SE EJECUTA EL BUCLE... POR LO VISTO NO SE EJECUTA...
           ++i;
       }else{
       error=true;
       ok=false;
       }//end else
       --pos;
   }//end while

   if(negativo) num*-1;          // PARA NUMEROS NEGATIVOS, NUM*-1
}

int longitud (const TCadena cad){
   int l=0;
   while(cad[l]!='\0') ++l;
   return l;
}
Título: Re: Pasar una cadena de caracteres a int. C++
Publicado por: engel lex en 18 Agosto 2015, 21:59 PM
tienes varios errores... como confundir numeros con caracteres

cad[pos]>=0 && cad[pos]<=9
eso está mal, ya que '0' no es lo mismo que 0... '0' es igual a 48
para resumir el codigo yo recomendaría hacer lo siguiente


Código (cpp) [Seleccionar]
num = 0
for(i=0;i<largo-1;i--){

  num *= 10;
  if(palabra[i] <'0' || palabra[i] >'9')
    //error
    break;
  num += palabra[i]-'0';
}
if(palabra[i]=='-'){
  num *= -1;
}else{
  num *= 10;
  num += palabra[i]-'0';

Título: Re: Pasar una cadena de caracteres a int. C++
Publicado por: seryioo en 18 Agosto 2015, 23:37 PM
No entiendo por qué pones '' si estás comparando 2 números, el que está dentro de la cadena y el 0 por ejemplo. ¿Qué diferencia hay entre ponerlos o no?

Código (cpp) [Seleccionar]
  if(palabra[i] <'0' || palabra[i] >'9')

Si pones '5', por ejemplo, lo que se mira es el codigo ASCII no?
Me he hecho un lío. Entonces, cuándo pongo '0' y cuando pongo 0?
Título: Re: Pasar una cadena de caracteres a int. C++
Publicado por: engel lex en 18 Agosto 2015, 23:40 PM
si, colocarlo en comillas simples hace que se vea como ascii


si haces int x = 0; x tendrá 0 por valor... si haces int x  = '0'; x tendrá por valor 48 que es el valor ascii de el simbolo '0'
Título: Re: Pasar una cadena de caracteres a int. C++
Publicado por: seryioo en 19 Agosto 2015, 11:22 AM
Otra cosa más, por qué restas aquí el ASCII de '0' ?

Código (cpp) [Seleccionar]
num += palabra[i]-'0'

Es que si no lo pongo me pasa lo siguente:

(http://fotos.subefotos.com/5a3168e615f543f1a8263c903b694f8eo.jpg)
Título: Re: Pasar una cadena de caracteres a int. C++
Publicado por: engel lex en 19 Agosto 2015, 14:33 PM
repito algo que ya dije

Cita de: engel lex en 18 Agosto 2015, 23:40 PM
si, colocarlo en comillas simples hace que se vea como ascii


si haces int x = 0; x tendrá 0 por valor... si haces int x  = '0'; x tendrá por valor 48 que es el valor ascii de el simbolo '0'

si tienes "51"

entonces cad[0] = '5', sabemos que '5' es igual a 53, así que le resto el primer caracter ascii de numero (48 que es representado por '0') para dejarlo como '5'-'0', es decir 53-48 que es 5
Título: Re: Pasar una cadena de caracteres a int. C++
Publicado por: seryioo en 19 Agosto 2015, 18:18 PM
Muchas gracias, duda resuelta. Es algo que no sabía.