2015-10-21 15 views
5

Kiedy używam printf w %*c%*c w printf, wymaga to 4 wartości, a także wypisuje sumy 4 i 5. Nie mogłem znaleźć uzasadnionego powodu.Co to jest% * c% * cw `printf`?

Podczas badania okazało się, że %*c oznacza szerokość. Ale jaka jest szerokość i jak można uzyskać sumę dla poniższego przykładu?

printf("%*c%*c", 4, ' ', 5, ' '); 

Ideone link

Kod:

#include <stdio.h> 

int add(int x, int y) 
{ 
    return printf("%*c%*c",x,' ', y,' '); 
} 

int main() 
{ 
    printf("%d",add(4,5)); 
    return 0; 
} 
+0

Proszę dodać cały swój przykładowy kod do swojego postu, a także dane wyjściowe - w tym przypadku ważne jest, aby odpowiedzieć! – usr2564301

+1

Możesz chcieć przeczytać odniesienie do pliku [a 'printf' (i rodziny)] (http://en.cppreference.com/w/c/io/fprintf)? –

+0

Aha i wszystko, co wywołuje pokazane przez ciebie 'printf', to drukowanie 9 spacji. –

Odpowiedz

5

printf("%*c%*c", 4, ' ', 5, ' '); drukuje przestrzeni w zakresie wielkości 4, a następnie przez przestrzeń w obszarze wielkości 5. Tak więc w sumie 9 znaków.

W swojej pisał kod, funkcja zwraca wynik printf co daje liczbę drukowanych znaków, więc 9. W głównym następnie wydrukować ten numer 9.

6

printf zwraca liczbę znaków drukowanych.

printf("%*c", N, C); drukuje N-1 półwyrobów następuje przez postać C

Ogólniej, printf drukuje N - length_of_text wykroje (jeśli ich liczba jest > 0 zero wykroje inaczej), a następnie przez tekst. To samo dotyczy również numerów.

zatem

return printf("%*c%*c", x, ' ', y, ' '); 

drukuje przestrzeni wraz z przedrostkiem x minus length_of_space innych miejscach (x-1), po czym wykonuje to samo dla y. To sprawia, że ​​4+5 spacji w Twojej sprawie. Następnie printf zwraca całkowitą liczbę znaków drukowanych, 9.

printf("%d",add(4,5)); 

Ten printf drukuje całkowita zwracana przez funkcję add(), 9.

Domyślnie printf jest wyrównany do prawej (spacje przed tekstem). Aby to lewo -Wyrównany albo

  • dać negatywny N lub
  • dodać - przed * np %-*s lub
  • działa również wersja statyczna, np. %-12s, %-6d
+1

Nie, 'printf ("% * c ", N, C)' wypisuje znak C w polu o rozmiarze N. –

+0

Zgadza się - użyłem '% XY' około dziesięciu tysięcy razy, nie wiem dlaczego napisałem początkowo "N razy" ... –

1

Wszystko jest zgodnie z oczekiwaniami. Według formacie manual


(opcjonalnie). po którym następuje liczba całkowita lub *, lub żadna z nich nie precyzuje precyzji konwersji.W przypadku, gdy użyte jest *, precyzja jest określona przez dodatkowy argument typu int. Jeśli wartość tego argumentu jest ujemna, zostanie zignorowana. Jeżeli nie użyto ani cyfry, ani *, dokładność przyjmuje się jako zero. Dokładne efekty precyzji można znaleźć w poniższej tabeli.

Zwracana wartość
1-2) Liczba znaków pisanych jeśli udanej lub ujemną wartość jeśli wystąpił błąd.

Więc w twoim przypadku:

int add(int x, int y) 
{ 
    return printf("%*c%*c",x,' ', y,' '); 
    //   ^x is for the first *, y for the second * 
} 

W rezultacie liczba x + y przestrzeni (w tym precyzja) pisemnej, która jest zwracana wartość.