Risposte:
Il modo di base è:
printf ("Here are the first 8 chars: %.8s\n", "A string that is more than 8 chars");
L'altro modo, spesso più utile, è:
printf ("Here are the first %d chars: %.*s\n", 8, 8, "A string that is more than 8 chars");
Qui, specifichi la lunghezza come argomento int di printf (), che tratta il '*' nel formato come una 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");
Questo è anche analogo alla notazione "% 8.8s", ma consente nuovamente di specificare le lunghezze minima e massima in fase di esecuzione - più realisticamente in uno scenario come:
printf("Data: %*.*s Other info: %d\n", minlen, maxlen, string, info);
La specifica POSIX per printf()
definisce questi meccanismi.
-
) per renderlo fino alla lunghezza specificata.
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 vuoi stampare sempre esattamente 8 caratteri puoi usare% 8.8s
Oltre a specificare un numero fisso di caratteri, puoi anche usare il *
che significa che printf prende il numero di caratteri da un argomento:
#include <stdio.h>
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'
Usando printf
puoi fare
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 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<char>(cout));
cout << endl;
O, in modo meno efficiente:
cout << "Here are the first 8 chars: " <<
string(s.begin(), s.begin() + 8) << endl;
ostream_iterator<char>(cout)
! Invece, usa ostreambuf_iterator<char>(cout)
! La differenza nelle prestazioni dovrebbe essere piuttosto grande.
std::cout.write(s.data(), 8)
. O nella moderna C ++, std::cout << std::string_view{s.data(), 8}
.
Stampa i primi quattro caratteri:
printf("%.4s\n", "A string that is more than 8 chars");
Vedi questo link per maggiori informazioni (controlla la sezione .precision)
In C ++ è facile.
std::copy(someStr.c_str(), someStr.c_str()+n, std::ostream_iterator<char>(std::cout, ""));
EDIT: è anche più sicuro usarlo con gli iteratori di stringhe, quindi non scappare via. Non sono sicuro di cosa accada con printf e string che sono troppo corti, ma credo che questo potrebbe essere più sicuro.
std::cout << someStr.substr(0,8);
è molto più ovvio.
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 controllo per evitarlo.