2012-05-13 12 views
12

Ho una stringa di formato come questo:Come posso stampare più volte la stessa variabile in una stringa?

buf[] = "A%d,B%d,C%d,D%d,F%d,G%d,H%d,I%d,J%d"; 

e voglio inserire lo stesso numero intero per ogni %d per cui uso:

int val = 6; 
sprintf(buf2, buf, val,val,val,val,val,val,val,val,val); 

Posso usare sprintf in un modo che solo mi obbliga scrivere val una volta e sprintf lo utilizzerà per ogni %d?

risposta

15

Sì, è possibile utilizzare %1$d ogni volta. Lo 1$ fa riferimento al secondo argomento, potresti ovviamente farlo anche con altri argomenti.

Demo: http://codepad.org/xVmdJkpN

Nota che la posizione di specificatore è un'estensione POSIX - quindi potrebbe non funzionare con ogni singolo compilatore. Se ne hai bisogno, per esempio con il compilatore di Visual C++, considerare l'utilizzo del modo brutto di ripetere l'argomento o non utilizzare affatto una funzione di tipo printf. Un'altra opzione sarebbe utilizzare un'implementazione sprintf compatibile con POSIX o l'utilizzo di più chiamate per aggiungere un numero ogni volta in un ciclo (nel caso in cui la stringa di formato venga creata dinamicamente, impedendo di specificare il numero corretto di argomenti).


Su una nota laterale, sprintf deve essere evitato. Utilizzare invece snprintf(buf2, sizeof(buf2), ....). Naturalmente ciò richiede che buf2 abbia una dimensione statica nota in fase di compilazione, ma se la si assegna manualmente è sufficiente utilizzare la variabile contenente la lunghezza anziché sizeof(buf2).

+0

È questo standard C? –

+0

Hai avuto ragione la prima volta: usa '% 1 $ d' perché' val' è il primo argomento della stringa di formato. –

+0

Quali sono i vantaggi dell'utilizzo di snprintf su sprintf? – Rhexis

5

Non esiste un metodo standard (cioè portatile) per farlo.

+0

L'OP ha fatto esplicitamente non chiedere un modo standardizzato però. Non penso ci sia davvero una buona ragione per non usare nessuna estensione utile al giorno d'oggi solo perché non sono nello standard. Soprattutto se non scrivi qualche biblioteca super-fantastica che tutti useranno presto! – ThiefMaster

+0

@ThiefMaster: Ma anche non ha specificato una piattaforma particolare. L'estensione POSIX non funziona in Visual C++, ad esempio. –

Problemi correlati