Hogyan helyzeti érvek, mint a „1 $” munka printf ()?

szavazat
11

By mantalálom

               printf(%*d, width, num);

és

               printf(%2$*1$d, width, num);

egyenértékűek.

De IMO a második stílus legyen ugyanaz, mint:

               printf(%*d, num, width);

Azonban keresztül tesztelés úgy tűnik, manigaza van; miért?

A kérdést 12/06/2011 13:41
a forrás felhasználó
Más nyelveken...                            


4 válasz

szavazat
3

Az Ön második példa:

printf("%2$*1$d", width, num);

Az első szám, 2, van csatlakoztatva a formátum meghatározásakor, és a második szám, 1, van csatlakoztatva a *. Ha elolvasta a dokumentációt printf, ez világos. Semmi szokatlan nem történik.

Válaszolt 12/06/2011 13:55
a forrás felhasználó

szavazat
21

Az érintett része a POSIX szabványban printf()határozza meg a jelenséget:

Konverziók lehet alkalmazni, hogy a n- edik argumentum után formátumot a paraméterek listája, ahelyett, hogy a következő nem használt érv. Ebben az esetben, az átalakító meghatározása karakter% (lásd az alábbiakban) helyébe a szekvencia „% n $”, ahol n jelentése decimális tartományba eső egész szám [1, {NL_ARGMAX}], így a helyzet a érv az érv lista. Ez a funkció biztosítja, hogy meghatározzák az formátumstring hogy válassza érveket megrendelést megfelelő specifikus nyelvek (lásd a Példák fejezetet).

A formátum tartalmazhat akár számozott argumentum konverziós specifikációkat (azaz, „% n $”, és „* m $”), vagy számozatlan érv konverziós specifikációkat (azaz,% és *), de nem mindkettő. Az egyetlen kivétel ez alól az, hogy a %% lehet keverni a „% n $” formában. Az eredményeket a keverés számozott és számozatlan érv leírások a format string nincsenek megadva. Amikor számozott érv az előírásokat alkalmazzák, meghatározva az N edik érv megköveteli, hogy az összes vezető érveket, az első, hogy a ( N-1 ) -edik, vannak megadva a formátum string.

A formátumstring tartalmazó „% n $” formájában konverziós specifikáció, számozott érveket a argumentumlista lehet hivatkozni a formátum string, ahányszor szükséges.

A %n$azonosítja az érv, amelynek értékét ki kell nyomtatni - érv 2 a példa.

A *n$azonosítja az érv, amelynek értékét kell kezelni a méret szélesség - érv 1 a példa.

Szóval, ezek az írás a kézi követte a szabvány.


Azt állítják, a comment:

2$*meg kell egyeznie a 2. paraméter, míg 1$dmeg kell egyeznie az első, de kiderült, hogy ez nem igaz abban az esetben printf("%2$*1$d", width, num);.

Amint azt már, a standard egyértelműen tulajdonít a n$részeket utótagmódosítók a %és *, nem pedig mint előtagmódosítók a formátum átalakító meghatározása ( debben a példában) és a *. A feltételezett tervezési lehetett, valószínűleg tenni a munkát, de nem volt a tervezés választott.

Válaszolt 12/06/2011 13:55
a forrás felhasználó

szavazat
1

A mező szélesség vagy pontosság vagy mindkettő lehet a csillaggal megjelölt „*” vagy egy csillag, majd egy vagy több decimális számjegy és a `$” helyett jegyű karaktersorozat.

Tehát az 1$vonatkozik a csillag, ezért az első argumentum a szélesség. A 2$vonatkozik a teljes formátum specifikációja, ezért a második érv az, amelynek értéke lesz nyomtatva.

Válaszolt 12/06/2011 13:56
a forrás felhasználó

szavazat
0

Egyetértek azzal, hogy az ember oldal zavaró, mert ez magyarázza a két fogalom ( hossz módosítót a helyzeti érv ) az egyik példa, úgyhogy megy a hatalmas pár vi/ gcc:

test.c

#include <stdio.h> 
void main(int argc, char** argv) {
    printf("%1$c\n", 'a', 'b', 'c');
    printf("%2$c\n", 'a', 'b', 'c');
    printf("%3$c\n", 'a', 'b', 'c');
    printf("%3$c %2$c %1$c\n", 'a', 'b', 'c');
}

Összeállítása ad figyelmeztetést, ha nem minden érv használjuk:

$ gcc test.c
test.c: In function ‘main’:
test.c:3:9: warning: unused arguments in $-style format [-Wformat-extra-args]
  printf("%1$d\n", 'a', 'b', 'c');
         ^~~~~~~~
test.c:4:9: warning: format argument 1 unused before used argument 2 in $-style format [-Wformat=]
  printf("%2$d\n", 'a', 'b', 'c');
         ^~~~~~~~
test.c:4:9: warning: unused arguments in $-style format [-Wformat-extra-args]
test.c:5:9: warning: format argument 1 unused before used argument 3 in $-style format [-Wformat=]
  printf("%3$d\n", 'a', 'b', 'c');
         ^~~~~~~~
test.c:5:9: warning: format argument 2 unused before used argument 3 in $-style format [-Wformat=]

De akkor itt az eredmény:

$ ./a.out
a
b
c
c b a
Válaszolt 10/01/2019 15:10
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more