Ho uno snippet di codice in cui è presente un file
printf("%.*s\n")
cosa %.*ssignifica?
Ho uno snippet di codice in cui è presente un file
printf("%.*s\n")
cosa %.*ssignifica?
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_lenargomento deve avere tipo int(o tipo integrale più stretto, che verrebbe promosso a int). Sarebbe un errore di passare long, size_te così via
%s, è stampare una sottostringa della stringa originale. In questo caso d'uso, strpunta a un punto all'interno della stringa originale (possibilmente all'inizio) e str_lenspecifica 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_to i suoi possibili alias, come std::string::size_type. Ciò crea ancora più confusione, tenendo conto che la pagina di riferimento menziona size_tcome 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.
sStringa di caratteri
printfchiamata valida .