¿Cómo maneja printf sus argumentos? Sé que en C# puedo usar la palabra clave params
para hacer algo similar, pero no puedo hacerlo en C?¿Cómo maneja printf sus argumentos?
Respuesta
Dicha función se llama variadic function. Es posible declarar una en C usando ...
, así:
int f(int, ...);
A continuación, puede utilizar va_start
, va_arg
y va_end
para trabajar con la lista de argumentos. He aquí un ejemplo:
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
void f(void);
main(){
f();
}
int maxof(int n_args, ...){
register int i;
int max, a;
va_list ap;
va_start(ap, n_args);
max = va_arg(ap, int);
for(i = 2; i <= n_args; i++) {
if((a = va_arg(ap, int)) > max)
max = a;
}
va_end(ap);
return max;
}
void f(void) {
int i = 5;
int j[256];
j[42] = 24;
printf("%d\n",maxof(3, i, j[42], 0));
}
Para obtener más información, por favor ver The C Book y stdarg.h.
La manera en que esto se hace en C se llama "varargs". Aquí hay un tutorial: http://c-faq.com/~scs/cclass/int/sx11b.html
Esta función se llama Números de variable de argumentos en una función. Debe incluir stdarg.h archivo de encabezado; a continuación, utilizar va_list tipo y va_start, va_arg, y va_end funciones dentro del cuerpo de su función:
void print_arguments(int number_of_arguments, ...)
{
va_list list;
va_start(list, number_of_arguments);
printf("I am first element of the list: %d \n", va_arg(list, int));
printf("I am second element of the list: %d \n", va_arg(list, int));
printf("I am third element of the list: %d \n", va_arg(list, int));
va_end(list);
}
luego llame a su función como esta:
print_arguments(3,1,2,3);
que será imprimir a continuación:
I am first element of the list: 1
I am second element of the list: 2
I am third element of the list: 3
¿Querías decir 'print_arguments (3,1,2,3)'? – bk1e
@ bk1e: gracias, he hecho un error tipográfico; ha actualizado – psihodelia
Como han dicho otros, printf usa va_args para funcionar. Es un ejercicio genial escribir tu propia versión de printf, si nada más para verificar que printf, a diferencia de writeln de Pascal, no es magia de compilación. Después de hacer eso, debe alejarse de él. Aquí hay un blog article que escribí detallando por qué (la respuesta corta es que puedes crear errores que pueden pasar desapercibidos durante mucho tiempo).
y justo para completar la historia gcc (no estoy seguro acerca de otros compiladores) soporta
#define FUNC(X,Y,...) wiz(X,Y, ##__VA_ARGS__)
para permitir que las macros variadic
- 1. ¿Cómo maneja Java los argumentos separados por |?
- 2. pasar demasiados argumentos de printf
- 3. ¿Cómo funcionan los argumentos posicionales como "1 $" con printf()?
- 4. cómo funciona printf internamente.
- 5. ¿Está permitido `` std :: function` mover sus argumentos?
- 6. Cómo curry una función w.r.t. sus argumentos opcionales en OCaml
- 7. ¿Cómo se maneja la conversión de float/double a int en printf?
- 8. ¿Cómo usaría el operador `...` C para obtener una función para imprimir todos sus argumentos?
- 9. ¿Cómo maneja PHP las variables?
- 10. formato printf en .NET
- 11. ¿Cómo funciona printf?
- 12. Cómo declarar printf()?
- 13. ¿Cómo maneja la salud de la batería de sus dispositivos de desarrollo cuando está siempre conectada?
- 14. ¿Cómo maneja Ruby bytes/binary?
- 15. ¿Cómo maneja Haskell el polimorfismo de sobrecarga?
- 16. ¿Puede una acción/delegar cambiar el valor de sus argumentos?
- 17. ¿cómo maneja Unix el nombre de la ruta completa con espacio y argumentos?
- 18. ¿Cómo maneja su organización los componentes comunes?
- 19. Cómo usar printf con NSString
- 20. printf y reglas de formato
- 21. C# - ¿Cómo maneja/captura StackOverFlowExceptions?
- 22. ¿Cómo maneja Smalltalk con monkeypatching?
- 23. ¿Cómo maneja jetty múltiples solicitudes?
- 24. ¿Cómo maneja una wiki varias ediciones simultáneas?
- 25. Cuándo usar `constantemente` en clojure, ¿cómo y cuándo se evalúan sus argumentos?
- 26. Registrar un mensaje con un número variable de argumentos de estilo printf
- 27. ¿Cómo maneja Git (Hub) posibles colisiones de SHA cortos?
- 28. ¿HttpGet maneja las cookies automáticamente?
- 29. ¿Cuál es la diferencia entre printf ("% i") y printf ("% d")
- 30. ¿Qué actividad maneja Intent.ACTION_CALL_PRIVILEGED?
Su ejemplo es un error y no funciona porque contradice a la sintaxis C. Tal vez has hecho un error tipográfico y olvidaste el guión bajo? – psihodelia
Además, mencionar '#include' estaría bien. –
Solucionado, gracias por los comentarios. –