Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda con cantidad de parametros indefinidos.

Estas en el tema de Duda con cantidad de parametros indefinidos. en el foro de C/C++ en Foros del Web. Bueno gente, la verdad estoy practicando un poco y estoy armando una funcion para poder concatenar una cantidad de cadenas indefinida, y estoy usando una ...
  #1 (permalink)  
Antiguo 09/10/2011, 21:29
Avatar de Doommarine_Maxi  
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 10 meses
Puntos: 8
Duda con cantidad de parametros indefinidos.

Bueno gente, la verdad estoy practicando un poco y estoy armando una funcion para poder concatenar una cantidad de cadenas indefinida, y estoy usando una funcion con una cantidad de parametros indefinidos.

Aqui el codigo:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <stdarg.h>
  3. #include <stdlib.h>
  4. using namespace std;
  5.  
  6. void pause()
  7. {
  8.      cout << "Presione Enter para finalizar..." << endl;
  9.      char c;
  10.      do
  11.      {    
  12.           c = getchar();
  13.      } while (c != '\n');
  14. }  
  15.  
  16.  
  17. char* MultiCad(int, ...);
  18. int maxLong(char* cadena)
  19. {      
  20.         int x=0;
  21.         while(cadena[x] != '\0')x++;
  22.         return x;
  23. }
  24. int main()
  25. {
  26.         printf("Cadena : %s\n", MultiCad(4, "Chuck ", "Norris", " es ","Dios"));
  27.         pause();
  28.         return 0;
  29. }
  30.  
  31. char* MultiCad(int max, ...)
  32. {
  33.         va_list p;
  34.         va_start(p, max);
  35.         int ac_size=0;
  36.         char* Cadena = (char*)calloc(sizeof(char), ac_size);
  37.         int ac_x=0;
  38.         for (int x=0; x < max; x++)
  39.         {
  40.                 char* temp = va_arg(p, char*);
  41.                 ac_size += maxLong(temp);
  42.                 Cadena = (char*)realloc(Cadena, (sizeof(char)*ac_size));
  43.                 for (int y=0; y < maxLong(temp); y++)
  44.                         Cadena[ac_x++] = temp[y];
  45.         }
  46.         va_end(p);
  47.         Cadena[ac_size] = '\0';
  48.  
  49.         return Cadena;
  50. }

Lo que me gustaria saber es si hay alguna forma en la que yo no tenga que declarar la cantidad de parametros.
  #2 (permalink)  
Antiguo 09/10/2011, 21:52
 
Fecha de Ingreso: abril-2010
Ubicación: Rosario
Mensajes: 1.850
Antigüedad: 14 años, 8 meses
Puntos: 228
Respuesta: Duda con cantidad de parametros indefinidos.

Te refieres a char* MultiCad(int max, ...) quitarle el int max???

Eso lo puede hacer pero deberias tu poner un metodo de cuando se terminan los argumentos...porque si lees de mas vas a empezar a leer basura....

Una recomendacion seria que el ultimo argumento que le pasas va a ser NULL, aprovechando que estamos en cadenas de caracteres....

Entonces la invocacion de la funcion seria:

funcion1 ("Hola" , " " , "mundo" , NULL);

Para porcesar los argumentos simplementes haces:

Código C++:
Ver original
  1. while ( temp = va_arg(p, char*) ) {
  2.  
  3.     // Codigo aqui
  4. }
  #3 (permalink)  
Antiguo 19/10/2011, 02:01
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 6 meses
Puntos: 73
Respuesta: Duda con cantidad de parametros indefinidos.

Que yo sepa, en C, cuando utilizas una función con un número variable de parámetros, los parámetros variables deben estar después del último parámetro fijo. Además, debe haber. al menos, un parámetro fijo. En tu caso, ya que lo que quieres es quitarte el int max y todo lo que vas a pasar después son cadenas de caracteres, declara

char *MultiCad (char *, ...)

y vas leyendo las cadenas de caracteres que sigan a la primera. Por supuesto, como te ha dicho Sam90, pasa NULL como último argumento.

Etiquetas: cantidad, concatenar, indefinida, parametros, stdarg.h, cadenas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:32.