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


127

C'è un modo per specificare quanti caratteri di una stringa stampare (simile alle cifre decimali in ints)?

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

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

Risposte:


226

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.


2
All'ultimo esempio: cosa succede se la stringa copiata è più corta di minlen?
truthseeker,

4
L'output sarà vuoto (a sinistra a meno che non si aggiunga a -) per renderlo fino alla lunghezza specificata.
Jonathan Leffler,

13
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


13

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'

11

Usando printfpuoi 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;

1
Nota: non usare ostream_iterator<char>(cout)! Invece, usa ostreambuf_iterator<char>(cout)! La differenza nelle prestazioni dovrebbe essere piuttosto grande.
Dietmar Kühl l'

Metodo più efficiente usare al posto di: std::cout.write(s.data(), 8). O nella moderna C ++, std::cout << std::string_view{s.data(), 8}.
Artyer,

4

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)


4

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.


32
ah, sì, è "facile". Il C ++ sembra sempre un incidente d'auto.
Presidente James K. Polk,

puoi ancora fare printf () in c ++ :)
StasM il

6
Penso che questo fosse sarcasmo. std::cout << someStr.substr(0,8);è molto più ovvio.
Salti

2
@MSalters Dovresti pubblicarlo come risposta.
Jonathan Mee,


1

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.