Autor
|
Tema: Pasar una cadena de caracteres a int. C++ (Leído 2,078 veces)
|
seryioo
Desconectado
Mensajes: 83
|
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; }
|
|
« Última modificación: 18 Agosto 2015, 19:42 pm por seryioo »
|
En línea
|
|
|
|
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 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';
|
|
|
En línea
|
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
Desconectado
Mensajes: 83
|
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?
|
|
|
En línea
|
|
|
|
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'
|
|
|
En línea
|
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
Desconectado
Mensajes: 83
|
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: 
|
|
« Última modificación: 19 Agosto 2015, 11:39 am por seryioo »
|
En línea
|
|
|
|
engel lex
|
repito algo que ya dije 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
|
|
|
En línea
|
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
Desconectado
Mensajes: 83
|
Muchas gracias, duda resuelta. Es algo que no sabía.
|
|
|
En línea
|
|
|
|
|
|