Pasar una cadena de caracteres a int. C++

Iniciado por seryioo, 18 Agosto 2015, 19:38 PM

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

seryioo

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

engel lex

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

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

seryioo

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?

engel lex

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'
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

seryioo

#4
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:


engel lex

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
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

seryioo

Muchas gracias, duda resuelta. Es algo que no sabía.