Referencia de un char [] en una función.[Akai pasate por favor que modificado]xD

Iniciado por anonimo12121, 24 Marzo 2011, 13:05 PM

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

anonimo12121

Hola de nuevo. xD mi siguiente problema es el siguiente.
Si le asigno un valor de la forma que está, funciona, pero si lo hago de la forma que esta como comentario no va.
Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
void cambiar_nombre(char *name,int a,int b);
void cambiar_nombre(char *name,int a,int b){
   /*char c[2];
   itoa(a,c,10);
   name[0]=c[0];
   name[b+1]=c[1];*/
   name[0]='a';
   name[1]='d';
};
int main(int argc,char *argv[]){
   char hola[]="hola";
   cambiar_nombre(hola,15,0);
   cout << hola;
   cin.get();
   cin.get();
   return 0;
}

El objetivo es cambia 2 caracteres por otros distinto de la siguiente forma 01 02 03, quiero decir que es para automatizar un cargado de imágenes que se llamen por ejemplo megaman-01. pues en el programa meteré funcion(megaman-01, cantidad)... mediante bucle hace lo que quiera pero me falla esto.

En el caso de usar int si me funciona.

Código (cpp) [Seleccionar]
#include <iostream>
using namespace std;
void funcion(int *num,int v,int p){
   int numerito[2];
   numerito[p]=v;
   numerito[p+1]=v+1;
   num[0]=numerito[0];
   num[1]=numerito[1];
};
int main(int argc,char *argv[]){
   int ka[]={5,5};
   funcion(ka,20,0);
   cout << ka[1];
   cin.get();
   return 0;
}
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Akai

#1
Voy ahora un poco justo de tiempo para ponerme a mirar qué falla,  pero así a primera vista, me da que tu problema está en el uso de itoa:

http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/

Lo miraré luego si tengo un rato, mientras, te dejo una alternativa que uso yo en uno de mis programillas:
Código (cpp) [Seleccionar]

char fnom[40];
std::ofstream fichero;
for(int i=0;i<nimg;i++){
sprintf(fnom,"histogrames/%d.dat",i);
fichero.open(fnom);
do_something();
fichero.close();
}

este código abre/crea ficheros en la carpeta histogrames con nombre 0.dat, 1.dat etc etc etc.

Para tu caso, te podría servir usar algo así pero primero obteniendo la parte sin números del nombre del fichero, para luego juntarlas usando sprintf.

anonimo12121

Cita de: Akai en 24 Marzo 2011, 14:04 PM
Voy ahora un poco justo de tiempo para ponerme a mirar qué falla,  pero así a primera vista, me da que tu problema está en el uso de itoa:

http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/

Lo miraré luego si tengo un rato, mientras, te dejo una alternativa que uso yo en uno de mis programillas:
Código (cpp) [Seleccionar]

char fnom[40];
std::ofstream fichero;
for(int i=0;i<nimg;i++){
sprintf(fnom,"histogrames/%d.dat",i);
fichero.open(fnom);
do_something();
fichero.close();
}

este código abre/crea ficheros en la carpeta histogrames con nombre 0.dat, 1.dat etc etc etc.

Para tu caso, te podría servir usar algo así pero primero obteniendo la parte sin números del nombre del fichero, para luego juntarlas usando sprintf.
Lo que tengo entendido de lo que dices es que tenga por ejemplo una archivo .txt o de lo que sea con el nombre del fichero a cargar. Y que cambie solo el número. pero básicamente es lo mismo que yo digo. lo que yo digo es dar el nombre y un bucle recorre 1 vez el nombre y localiza la parte numérica , hasta ahí bien . lo que me falla es el pasar un int a  char. Que seria básicamente el int i del bucle.
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Akai

Pasar de int a char[], te lo he puesto, pero no has mirado lo suficiente:

Código (cpp) [Seleccionar]
sprintf(fnom,"histogrames/%d.dat",i);
Ese es mi código. Que coloca en la cadena fnom "histogrames/(valor de i).dat

Código (cpp) [Seleccionar]
sprintf(fnom,"%d",i);
y con esa simple modificación imprimes un número en la cadena fnom.

Hay que mirar más xD

anonimo12121

Es que no uso printf y eso nunca XD. como sería en c++¿
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

Akai

Eso está en C++. sprintf es una función de la biblioteca cstdio. Recordemos que C se puede catalogar como un subconjunto dentro de C++ si miramos que C++ incluye todo (o casi todo) lo de C.

Tu alternativa, posiblemente entre otras, usar sstreams:
Código (cpp) [Seleccionar]

#include <sstream>
std::stringstream z;
z << "hello " << 99;

http://cplusplus.com/reference/iostream/stringstream/

Samael.Black

#include <iostream>
#include <stdlib.h> // te falto agregar la librería stdlib.h
using namespace std;
void cambiar_nombre(char *name,int a,int b);
void cambiar_nombre(char *name,int a,int b){
    char c[2];
    itoa(a,c,10);
    name[0]=c[0];
    name[b+1]=c[1];
    name[0]='a';
    name[1]='d';
};
int main(int argc,char *argv[]){
    char hola[]="hola";
    cambiar_nombre(hola,15,0);
    cout << hola;
    cin.get();
    cin.get();
    return 0;
}

anonimo12121

#7
Pero me gustaría saber como cambiar un caracter a megaman-01 que sea convirtiendo un int a un char y asignandolo a la posición.

Si miráis este código podéis ver que el valor se le asigna dentro de la función pero fuera no.
Código (cpp) [Seleccionar]
#include <iostream>
#include <stdlib.h>
using namespace std;
void cambiar_nombre(char *name,int a,int b);
void cambiar_nombre(char *name,int a,int b){
    char c[2];
    itoa(a,c,10);
    name[b]=c[0];
    name[b+1]=c[1];
    cout << c[0] << endl;
    cout << c[1] << endl;
    cout << name[0] << endl;
    cout << name[1] << endl;
   
};
int main(int argc,char *argv[]){
    char hola[]="hola";
    cambiar_nombre(hola,15,0);
    cout << "\n----------------------------"<< endl;
    cout << hola;
    cin.get();
    cin.get();
    return 0;
}
Página para ganar Bitcoins y Dinero: http://earnbit.hol.es/
Video de YouTube con Hack para el LoL: http://adf.ly/5033746/youtube-lolemuhack
Si quieres ganar dinero con adfly entra y registrate aquí -> http://adf.ly/?id=5033746

KevinSec

#include <iostream>
#include <stdlib.h>
using namespace std;


char * cambiar_nombre(char *name,int a,int b){

for(int i =a; i<=b; i++)
{
char tmp[30];
sprintf(tmp, "%s0%d", name, i);
cout << tmp << endl;
}

};
int main(int argc,char *argv[]){
    char hola[]="hola";
    cambiar_nombre(hola, 0, 15);
    getchar();
    return 0;
}


¿Pides esto?

D4RIO

#9
@Samael.Black, "stdlib.h"?? O usas C, o usas C++, en el cual la biblioteca estándar de C se usa como <cstdlib>

@Xafi, Algunas cosas
Cita de: Xafi en 24 Marzo 2011, 16:19 PM
Es que no uso printf y eso nunca XD. como sería en c++¿
Diría que no usas C ni C++ nunca, ni siquiera estás asignando correctamente las cadenas, ni declarandoles correctamente, sea para C o para C++. A demás, mencionas no usar "printf y eso" (¿?) y preguntas cómo sería en C++ cuando en tu primer "approach" usas "itoa"  ;-)  En fin, si vas a usar C++ como "lenguaje", podrías empezar por usar stringstream para convertir un entero a cadena, como te refirió Akai antes, que sería algo asi:

Código (cpp) [Seleccionar]
stringstream sstr;
sstr.str().clear();
sstr<<tuEntero;


Y luego:

Código (cpp) [Seleccionar]
sstr.str()

Para obtener un objeto string conteniendo el número como cadena.

Te daré una solución al estilo C++, pero tendrás que investigar cómo hacerlo y escribirlo por tu cuenta, de otra forma sentirías el "placer" de verlo funcionar sin el esfuerzo de aprenderlo, ni el entendimiento necesario  :¬¬

Primero, pasarás una referencia de la cadena a una función, no hablo de un puntero, sino una referencia, y usarás la clase string para trabajar con ella. Después, utilizarás stringstream para convertir tu número, modificarás el string, y notarás cómo al pasar una referencia, obtienes los cambios de regreso.

Cheers  :-*
OpenBSDFreeBSD