2014-11-04 11 views
6

Chcę wydrukować wartość zmiennej bez podawania jej typu.Czy istnieje ogólny specyfikator konwersji dla printf?

w C, co mogę zrobić

int main(int argc, char **argv) { 
    int i = 1; 
    float f = 0.1; 
    char s[] = "s"; 

    printf("%i\n", i); 
    printf("%f\n", f); 
    printf("%s", s); 
    return 0; 
} 

ale spodziewam:

int main(int argc, char **argv) { 
    int i = 1; 
    float f = 0.1; 
    char s[] = "s"; 

    printf("%any_type\n", i); 
    printf("%any_type\n", f); 
    printf("%any_type", s); 
    return 0; 
} 

pytanie: ma %any_type w C?

Odpowiedz

11

W C11 można napisać ogólną funkcję drukowania dowolnego typu i nadal dodawać niestandardowy typ do tej funkcji.

#define print_any(X) _Generic((X), int: print_int, \ 
           default: print_unknown, \ 
           float: print_float)(X) 

int print_int(int i) 
{ 
    return printf("%d\n", i); 
} 

float print_float(float f) 
{ 
    return printf("%f\n", f); 
} 

float print_unknown(...) 
{ 
    return printf("ERROR: Unknown type\n"); 
} 

Można również zautomatyzować generowanie funkcji, jak pokazano poniżej.

#define GEN_PRINT(TYPE, SPECIFIER_STR) int print_##TYPE(TYPE x) { return printf(SPECIFIER_STR "\n", x);} 
GEN_PRINT(int, "%d"); 
GEN_PRINT(char, "%c"); 
GEN_PRINT(float, "%f"); 

Wykorzystanie będą:

int main(int argc, char **argv) { 
    int i = 1; 
    float f = 0.1; 
    char s[] = "s"; 

    print_any(i); 
    print_any(f); 
    print_any(s); 
    return 0; 
} 
+0

za miłość Mojżesza, przynieś próbkę lub porozmawiaj o tym więcej. : '( –

+0

więcej informacji na ten temat [tutaj] (http://www.robertgamble.net/2012/01/c11-generic-selections.html) –

+1

@KickButtowski Dodano trochę informacji.Dziękuję Matt. –

9

Nie, musisz podać poprawny specyfikator formatu.

W C11 można zautomatyzować obliczanie poprawnego specyfikatora formatu, używając _Generic w połączeniu z makrem. Musisz jednak powtórzyć nazwę zmiennej (raz, aby obliczyć specyfikator, i raz, aby podać zmienną jako argument).

Aby uzyskać więcej informacji read this link.

+0

Zostało to zaksięgowane jako odpowiedź, ale nie próbuje odpowiedzieć na pytanie. Prawdopodobnie powinna to być edycja, komentarz, inne pytanie lub całkowicie usunięte. –

+0

@KickButtowski - To jest odpowiedź na pytanie: czy istnieje% any_type in c? tj. nr –

+0

Boże uchowaj, publikuję taką odpowiedź. przynajmniej post może być pouczający. spróbuj wyjaśnić, jak sformatować i jakie są opcje ... Więcej informacji nie zabije nikogo –

1

Nie ma takich rzeczy. Musimy określić, w jakim formacie będziemy drukować tę wartość.

4

Nie printf jest tzw variadic function, co oznacza, że ​​może podjąć każdą cyfrę/typ parametrów.

Problem (dobrze, jeden z nich) z funkcjami variadycznymi w klasycznym C jest taki, że parametry nie są bezpieczne, to znaczy - wywoływana funkcja nie ma pojęcia o parametrze typu.

To jest powód, dla którego zmienne są wpisywane przy użyciu ciągu formatu, aby rozpocząć, printf nie ma pojęcia, czy przekazana wartość jest wskaźnikiem, liczbą całkowitą lub jakimś innym typem, i trzeba spojrzeć na ciąg formatu, aby dowiedzieć się w jaki format wyświetlić wartość.

To niestety również otwiera możliwość błędów, jeśli ciąg znaków jest nieprawidłowy, na przykład mówiąc, że wartość jest wskaźnikiem do czegoś, gdy jest to rzeczywiście liczba całkowita, program może ulec awarii (lub dokładniej, spowodować niezdefiniowane zachowanie) z prób uzyskania dostępu do wartości bez wskaźnika jako wskaźnika.

+0

@remyabel Dzięki, dodaliście te informacje. –

Powiązane problemy