C’è un modo per specificare quanti caratteri di una stringa stampare usando printf ()?

C’è un modo per specificare il numero di caratteri di una stringa da stampare (simile a cifre decimali in int s)?

 printf ("Here are the first 8 chars: %s\n", "A string that is more than 8 chars"); 

Vorrebbe che stampasse: Here are the first 8 chars: A string

Il modo di base è:

 printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars"); 

L’altro, spesso più utile, è:

 printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars"); 

Qui, si specifica la lunghezza come argomento int a printf (), che tratta il ‘*’ nel formato come richiesta per ottenere la lunghezza da un argomento.

Puoi anche usare la notazione:

 printf ("Here are the first 8 chars: %*.*s\n", 8, 8, "A string that is more than 8 chars"); 

Anche questo è analogo alla notazione “% 8.8s”, ma di nuovo consente di specificare la lunghezza minima e massima in fase di esecuzione – in modo più realistico in uno scenario come:

 printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info); 
 printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars"); 

% 8s specifica una larghezza minima di 8 caratteri. Vuoi troncare a 8, quindi usa% .8s.

Se si desidera stampare sempre esattamente 8 caratteri, è ansible utilizzare% 8.8 s

Usando printf puoi farlo

 printf("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars"); 

Se stai usando C ++, puoi ottenere lo stesso risultato usando l’STL:

 using namespace std; // for clarity string s("A string that is more than 8 chars"); cout < < "Here are the first 8 chars: "; copy(s.begin(), s.begin() + 8, ostream_iterator(cout)); cout < < endl; 

O, meno efficacemente:

 cout < < "Here are the first 8 chars: " << string(s.begin(), s.begin() + 8) << endl; 

Oltre a specificare una quantità fissa di caratteri, puoi anche usare * che significa che printf prende il numero di caratteri da un argomento:

 #include  int main(int argc, char *argv[]) { const char hello[] = "Hello world"; printf("message: '%.3s'\n", hello); printf("message: '%.*s'\n", 3, hello); printf("message: '%.*s'\n", 5, hello); return 0; } 

stampe:

 message: 'Hel' message: 'Hel' message: 'Hello' 

Stampa i primi quattro caratteri:

printf("%.4s\n", "A string that is more than 8 chars");

Vedi questo link per maggiori informazioni (controlla .precision -section)

In C ++ è facile.

 std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator(std::cout, "")); 

EDIT: È anche più sicuro usare questo con gli iteratori di stringhe, in modo da non correre alla fine. Non sono sicuro di cosa succede con printf e string che sono troppo brevi, ma credo che questo potrebbe essere più sicuro.

printf ( “%. ….. 8s”)

In C ++, lo faccio in questo modo:

 char *buffer = "My house is nice"; string showMsgStr(buffer, buffer + 5); std::cout < < showMsgStr << std::endl; 

Si noti che questo non è sicuro perché quando si passa il secondo argomento posso andare oltre la dimensione della stringa e generare una violazione di accesso alla memoria. Devi implementare il tuo assegno per evitare questo.