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)
/*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.
#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;
}
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
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';
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?
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?
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'
Otra cosa más, por qué restas aquí el ASCII de '0' ?
num += palabra[i]-'0'
Es que si no lo pongo me pasa lo siguente:
(http://fotos.subefotos.com/5a3168e615f543f1a8263c903b694f8eo.jpg)
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
Muchas gracias, duda resuelta. Es algo que no sabía.