int a char*, c++

Tengo un problemilla y es que no se hacer este tipo de conversión, la cuál necesito para pasarsela como parámetro a una función. He hecho esto:
....
int n=5;
char cad[2];
cad[0]=n;
cad[1]='0';
funcion(...,cad,...);

Como lo puedo convertir si de esta manera no funciona?
Hay varios modos, siempre puedes currarte la función tu mismo o usar sprintf, una solución para convertir a decimal que sera lo que te interesa:
int value;
char buffer [33];
.........
sprintf(buffer,"%d",value);
// Ahora se copia el entero contenido en buffer al string donde lo queremos o en ciertos casos se puede usar directamente
........

"%d" es lo mismo que en printf y corresponde a entero con signo

Si solo va a ser un numero contenido entre 0 y 99 hay otras maneras mas rapidas, algunas propensas a error y otras que no lo son como, te espongo una funcion de conversion a mano:

int n=5;
int i,temp,digito;
int longitud=2
char cad[longitud];
.............
temp=n;
i=longitud-1
for(; -1<i ; i--){ \\ "-1<i" es lo mismo que "0<=i"
digito= 48 + temp%10;
cad[i][i] [i]= (char) digito;
temp=temp/10;[i]
}
................
funcion(...,cad,...);
...............

[/i][/i][i]El inconveniente de esta funcion es que hay que saber el tamaño del numero de antemano y solo funciona en ascii, [/i][i]creo que esta funcion falla con numeros negativos, se puede corregir para soportarlos sin ningun problema o para cualquier tamaño.[/i][/i]
No acabo de entender lo que quieres hacer. Es casting lo que necesitas quizas?

int n = 5;
char c;

c = (char)n;
Elohe:
Prefiero hacerlo manual antes que con un sprintf, y la función que me has puesto no la acabo de entender

Raharu;
He probado lo que me comentas y me da un error al intentar convertir de tipo 'char' a 'char *', que es lo que recibe la funcion que quiero pasarle el dato.

He pensado utilizando memoria dinamica;

char *c;
int longitud,n;
longitud=ncifras(n);//supongamos que es una funcion que me devuelve el numero de cifras de un numero
c=new char[longitud];
c[0]=n;
c[1]='\0';

Pero me siguen saliendo símbolos.Una preguntilla sobre esto:
¿Tengo que reconstruir la cadena lugar a lugar?. me explico supongamos que el numero que quiero convertir tiene 3 cifras es el 345. Para construir la cadena seria así?:
cad[0]=3;
cad[1]=4;
cad[2]=5;
cad[3]='\0'

Un salu2 y gracias
Si que hay que reconstruir la cadena lugar a lugar, te comento la funcion:

temp=n; // Guardamos el valor a convertir en un variable local
i=longitud-1; // se almacnea la longitud del vector-1, es decir el valor del ultimo elemento
for(; -1<i ; i--){ \\ "-1<i" es lo mismo que "0<=i" ,  este bucle recorre el vector desde atras
digito= 48 + temp%10; //calculamos el valos ascii del digito de mas a la derecha que es el resto de dividir n/10 y sumarle 48 que es  la posicion de 0 en ascii
cad[i] = (char) digito; se hace un cast de el valor de digito a char
temp=temp/10;// se divide entre 10 para poder al repetir el bucle obtener el siguienbte digito
}

[/i]
PD2. Añado funcion ejemplo pero no garantizo de que valla ya que no la he podido probar la he probado y corregido por lo que funciona al 100%
//conversion entero 32bits a cadena de caracteres
//tamaño de cadena ideal 12, se repartes en 10 para
//el numero, 1 para el signo y otro para el terminador


int int32tochar(char * cadena, int numero){
int indice,negativo,temp;
if (numero==0) {
cadena[0]='0';
cadena[1]='\0';
}
else {
// codigo para tratar numeros negativos e inicializar valores

if (numero<0){
numero=0-numero;
cadena[0]='-';
negativo=1;
indice=2;
}
else{
negativo=0;
indice=1;
}
//contamos numeros de digitos decimales
temp=numero;
while(temp=temp/10) indice++;
//se convierte el vector
cadena[indice]='\0';
while(numero>0) {
indice--;//se decrementa el indice para que apunte al digito deseado en el vector
cadena[indice]= (char)(48+numero%10); //se optione el valor ascii del numero;
numero=numero/10;
}
}
return 1;
}
Sobre todo ten en cuenta que 3 !='3', que me he fijado que en el ejemplo del número 345 no ponías las comillas más que en el '\0'.

'3' == 3 + 48 //(48 == valor ASCII de '0')

Sé que es una tontería pero por si acaso, que ya me ha pasado a mi veces de rayarme a lo tonto por una cosa de estas.

Por cierto, si te dejan usar asignaicón dinámica de memoria, mi elección sería hacerme una función que me devolviese un array de enteros (o de chars directamente sólo porque ocupan un byte, pero con enteros, ya que un byte sobra para almacenar un dígito de 0 a 9), y otra que le sume 48 a cada una de las posiciones, imprimir por pantalla como chars y a correr.
Muchas gracias por las respuestas pero no consigo solucionar el problema, no porque estén vuestras soluciones mal, sino que hago un mi propia implementación de lo que me habéis dicho, para entender el código mejor. Os voy a explicar lo que tengo que hacer haber si puedo solucionar este problema de una vez.
Bueno resulta que tengo que hacer un triangulo de pascal:
http://es.wikipedia.org/wiki/Tri%C3%A1ngulo_de_Pascal

Tengo 3 posibles soluciones de hacerlo:
1-Sin darle formato al triangulo en la terminal, osea ..
1
1 2 1
1 3 3 1
1 4 6 4 1
2 - Dándole formato en la terminal, osea...
1
1 2 1
1 3 3 1
1 4 6 4 1
3-Utilizando las librerías gráficas SDL, que ha modificado nuestro profesor para utilizarlas nosotros, teniendo que quedar como la segunda opción pero en una ventana independiente de la terminal.

Yo estoy haciendo la 3 opción, ya que he hecho la 2 y me ha sobrado tiempo para hacer esta última.

Todo el problema ya lo tengo resuelto, osea el problema de rellenar la ""pirámide de números", a través de una librería que he construido con una serie de funciones para ayudarme ha realizar el trabajo. El problema de darle la forma de de pirámide también lo tengo resuelto, lo único que me queda es ya lo comentado anteriormente en el post, convertir los numeros de la piramide a char * para poder utilizar una función de la librería gráfica. El código que he hecho en función de vuestra ayuda es este;

Esta es la funcion de conversion (he descartado los números negativos porque no los necesito para este programa):
char *conversion(int num,int tamano){
int indice;
indice=ncifras(num);
char cad[indice];
cad[indice]='\0';
while(indice>=0){
indice--;
cad[indice]= (char)(48+num%10);
num=num/10;
}
return &cad[indice+1];
}

Para calcular el numero de cifras de un número
int ncifras(int num){
int indice=1;
while(num>10){
num=num/10;
indice++;
}
return indice;
}


y el trozo de codigo donde llamo a la funcion es:
void grafica(const Triangulo &tri){
int fila=1,columna=1,aux=0,x1=8,y1=8,y2=16,aux_y1=8,longitud,tam,var=0,col=1,n;
bool band=true;
char *cadena;
CrearVentana(500,500,"Triangulo de Pascal");
while(fila<=NumeroFilas(tri)){
tam=NumeroFilas(tri)-NumeroColumnas(tri,fila);
RectanguloR(x1,y1,tam*8+x1,y2,0,0,0);
longitud=tam*8+x1;
while(columna<=(NumeroColumnas(tri,fila)+aux)){
if(band==true){
var=ncifras(GetElemento(tri,fila,col));
cadena=conversion(GetElemento(tri,fila,col),var);
cout<<"cadena:"<<*cadena< Texto(longitud,y1,cadena,0,255,0);
col++;
longitud=longitud+(8*var);
columna++;
band=false;
}
else{
RectanguloR(longitud,y1,longitud+8,y2,0,0,0);
longitud=longitud+8;
band=true;
columna++;
}
}
col=1;
fila++;
y1=y2;
y2=y2+8;
band=true;
columna=1;
aux++;
}
ObtenerTecla();
}


GetElemento -> es una función que me he creado para saber el número almacenado en un triangulo de pascal, diciendole el número de filas y el número de columnas,


Texto-> void Texto(int x, int y, const char *c,unsigned char r, unsigned char g, unsigned char b,GRF_Imagen img=0);

Es la funcion que me proporciona mi profesor para escribir los números en la ventana.
int x e int y, le indica la coordenada donde pintar.
const char *, es lo que quiero pintar(donde tengo el problema)
unsigned char r, unsigned char g, unsigned char b->colores rgb, que se los indico a mano yo en la funcion
GRF_Imagen img=0-> parámetro opcional que no utilizo

Con el código que tengo actualmente no me pinta nada en la ventana que creo, pero he introducido un " cout<< "cadena"<<*cad<
Que tengo que modificar para solucionarlo?
funcion conversión.

-Primer fallo.
cad[indice]='\0' /* esta sobrepasando el tamaño de cad hacer car cad[indice+1]*/


-Segundo fallo
return &cad[indice+1];
Fallo enorme.
No se puede retornar un puntero a una variable local.

Solución primaria, en local
#define MAX_LEN_CADENA 1000 /* o lo que quieras */
static char cad[MAX_LEN_CADENA];

Solución mas complicada, usar malloc.

Otra solución hacer cad global, o usar strings c++ si estas en c++.

Saludos
1º-Por que no quieres usar snprintf ?!, a mi me parece la manera mas sencilla y segura de hacerlo.

2º-si es necesario devolver una cadena un array, o algo parecido, se suele requerir una zona de memoria con espacio suficiente reservado como parametro de entrada (observa snprintf). Otra opción es usar malloc en la función.

3º-Una forma sencilla y guarra de obtener el caracter ascii correspondiente es con :
int n=9;
char b;
b=n+'0';

Eso deja en b el caracter ascii correspondiente a 9.

4º- Si se quiere obtener la dirección de un elemento puedes usar "&".
OJO!:
si
char b='9';
char *c="9";

El contenido de b y c no es el mismo.

P.D. leete un buen libro :).
P.D2. luego sigo que tengo que irme
Este codigo;

char *conversion(int num,int tamano){
int indice;
indice=ncifras(num);
char cad[indice];
cad[indice]='\0';
while(indice>=0){
indice--;
cad[indice]= (char)(48+num%10);
num=num/10;
}
return &cad[indice+1];
}



lo he tenido que dejar asi para solucionar un error anteriormente dicho:

char * conversion(int num){
int indice;
indice=ncifras(num);
static char cad[11]; //para podere devolver cad debe de ser estatica, usr malloc, ser strinc++ o deben de pasartela
cad[indice]='\0';
while(indice>0){ //aqui tenias otro error
indice--;
cad[indice]= (char)(48+num%10);
num=num/10;
}
return cad; //tenias otro error
}


por cierto "return cad" es lo mismo que "return &cad[indice];"
Muchas gracias a todos ya he resuelto el ejercicio.

No utilizaba sprintf o itoa porque no el profesor nos comento que lo hiciéramos nosotros, no que utilizáramos esas funciones.

Un salu 2
10 respuestas