Ho uno snippet di codice in cui è presente un file
printf("%.*s\n")
cosa %.*s
significa?
Ho uno snippet di codice in cui è presente un file
printf("%.*s\n")
cosa %.*s
significa?
Risposte:
Puoi usare un asterisco ( *
) per passare lo specificatore di larghezza / precisione a printf()
, invece di codificarlo in modo rigido nella stringa di formato, ad es.
void f(const char *str, int str_len)
{
printf("%.*s\n", str_len, str);
}
str_len
argomento deve avere tipo int
(o tipo integrale più stretto, che verrebbe promosso a int
). Sarebbe un errore di passare long
, size_t
e così via
%s
, è stampare una sottostringa della stringa originale. In questo caso d'uso, str
punta a un punto all'interno della stringa originale (possibilmente all'inizio) e str_len
specifica la lunghezza della sottostringa da stampare.
Maggiori dettagli qui .
valore intero o
*
che specifica la larghezza minima del campo. Il risultato viene riempito con caratteri di spazio (per impostazione predefinita), se necessario, a sinistra se giustificato a destra oa destra se giustificato a sinistra. Nel caso in cui venga utilizzato *, la larghezza è specificata da un argomento aggiuntivo di tipo int. Se il valore dell'argomento è negativo, risulta con il flag specificato e larghezza del campo positiva. (Nota: questa è la larghezza minima: il valore non viene mai troncato.)
.
seguito da un numero intero o * o nessuno dei due che specifica la precisione della conversione. Nel caso in cui venga utilizzato *, la precisione è specificata da un argomento aggiuntivo di tipo int. Se il valore di questo argomento è negativo, viene ignorato. Se non viene utilizzato né un numero né un *, la precisione viene considerata zero. Vedere la tabella seguente per gli effetti esatti della precisione.
Quindi, se proviamo entrambe le specifiche di conversione
#include <stdio.h>
int main() {
int precision = 8;
int biggerPrecision = 16;
const char *greetings = "Hello world";
printf("|%.8s|\n", greetings);
printf("|%.*s|\n", precision , greetings);
printf("|%16s|\n", greetings);
printf("|%*s|\n", biggerPrecision , greetings);
return 0;
}
otteniamo l'output:
|Hello wo|
|Hello wo|
| Hello world|
| Hello world|
Non penso che il codice sopra sia corretto ma (secondo questa descrizione di printf()
) i .*
mezzi
La larghezza non è specificata nella stringa di formato, ma come argomento di un valore intero aggiuntivo che precede l'argomento che deve essere formattato. '
Quindi è una stringa con una larghezza passabile come argomento.
int
(o un sottoinsieme di esso) - non solo un valore integrale come più intuitivo size_t
o i suoi possibili alias, come std::string::size_type
. Ciò crea ancora più confusione, tenendo conto che la pagina di riferimento menziona size_t
come uno degli specificatori di tipo supportati.
Vedi: http://www.cplusplus.com/reference/clibrary/cstdio/printf/
.*
La precisione non è specificata nella stringa di formato, ma come argomento di un valore intero aggiuntivo che precede l'argomento che deve essere formattato.
s
Stringa di caratteri
printf
chiamata valida .