Jestem obecnie programowanie własną implementację printf
, oto kod:Dobre maniery programowania C
int my_printf(const char *format, ...)
{
//Declare variable ou prog fonctionnel????
va_list args;
int numberValue;
unsigned int unsignedNumberValue;
double doubleValue;
char* stringValue;
char charValue;
va_start(args, format);
for(int i = 0; format[i]; i++){
//This case is the most called case, so we test it first to get the
//best perfs
if(format[i] != '%'){
my_put_char(format[i]);
}else{
if(format[i+1] == 'd' || format[i+1] == 'i'){
numberValue = va_arg(args, int);
my_put_nbr(numberValue);
}else if(format[i+1] == 'u'){
unsignedNumberValue = va_arg(args, unsigned int);
my_put_nbr_unsigned(unsignedNumberValue);
}else if(format[i+1] == 'o'){
numberValue = va_arg(args, int);
my_put_nbr_base(numberValue, 2);
}else if(format[i+1] == 'c'){
//char parameters are passed as integer as va_args
charValue = va_arg(args, int);
my_put_char(charValue);
}else if(format[i+1] == 's'){
stringValue = va_arg(args, char*);
my_puts(stringValue);
}else if(format[i+1] == 'f'){
doubleValue = va_arg(args, double);
my_put_double(doubleValue);
}else if(format[i+1] == '%'){
my_put_char('%');
}else{
//error option not handled
char* error = my_strcat("\nThe option you provided is not a valid option: %", &format[i + 1], 1);
write(2, error, sizeof(char) * my_strlen(error));
}
i++;
}
}
va_end(args);
return 0;
}
Chciałbym wiedzieć dwie rzeczy na temat mojego kodu:
- Zastanawiam się, czy powinienem kod "funkcja" programowania takich jak nie używać zmiennej i umieścić
va_args
o nazwie bezpośrednio w funkcjimy_put
. Ale robiąc to, przydzieli i zwolni każdą pętlę zamiast jednej deklaracji (alokacji), która może nie być użyta, a jedna wolna na końcu funkcji. W dużym procesie, przypuszczam, że lepiej jest zapisać zwracaną wartość w zmiennej, a następnie wywołać funkcję "funkcyjną". (dlastrlen
na bardzo dużym tekście na przykład) - Chciałbym również wiedzieć, jak radzić sobie z funkcjami, które można wywołać z różnymi typami, takimi jak
my_put_nbr
w moim kodzie, czy nie mogę ich przeciążać? Wygląda na to, że musi mieć inną nazwę.
Przepraszam, nie wiedziałem o stronie CodeReview, czy powinienem przenieść mój post? – zyrkiem64
C nie ma przeciążenia funkcji. –
Jeśli chodzi o twoje pierwsze pytanie, jeśli nie chcesz zmiennej pośredniej, po prostu napisz 'my_put_double (va_arg (args, double));'. 'va_arg (...)' jest zwykłym wyrażeniem; nie musisz go używać w oświadczeniu przydziału. Ogólnie rzecz biorąc, warto rozważyć użycie instrukcji 'switch' zamiast długiego łańcucha' if ... else if ... '. Przełącznik jest bardziej czytelny, a czasami szybszy. – rici