2010-01-26 2 views
48

Come posso stampare una stringa non terminata da null usando printf, assumendo che conosca la lunghezza della stringa in fase di esecuzione?Come si stampa una stringa non terminata con null utilizzando printf?

+3

Perché non utilizzare FWrite? –

+4

Se non è terminato con null, quindi per definizione non è una stringa. –

+3

non è solo una _c stringa_, in quanto sarebbe una stringa valida in altre lingue .. e anche se una "matrice di caratteri non terminata da null" sarebbe più accurata, sono abbastanza sicuro che fosse universalmente compresa. – Willdorf

risposta

81
printf("%.*s", length, string); 

Usa insieme ad altri argomenti:

printf("integer=%d, string=%.*s, number=%f", integer, length, string, number); 
//       ^^^^      ^^^^^^^^^^^^^^ 

In C è possibile specificare la lunghezza massima per l'uscita con il formato %.123s. Ciò significa che la lunghezza di output è al massimo di 123 caratteri. Il 123 potrebbe essere sostituito da *, in modo che la lunghezza venga presa dall'argomento di printf anziché codificata.

noti che questo assume il string non contiene byte nulli interni (\ 0), come %.123s vincola solo la lunghezza massima non la lunghezza esatta e stringhe sono ancora considerato null-terminata.

Se si desidera stampare una stringa con terminazione non nullo con null interno, non è possibile utilizzare una sola stampa. Utilizzare fwrite invece:

fwrite(string, 1, length, stdout); 

Vedi @M.S.Dousti's answer per una spiegazione dettagliata.

+0

Grazie per la risposta rapida ! – Mike

+5

nota: 'length' deve avere il tipo' int' qui, dopo le promozioni degli argomenti predefinite. Se la tua variabile 'length' è qualcosa di più grande (ad esempio' size_t') dovresti lanciarla su '(int)' altrimenti il ​​tuo codice si romperà su una piattaforma dove 'size_t' è più largo di' int'. –

13

La risposta fornita da @KennyTM è ottima, ma con una sottigliezza.

In generale, se la stringa non è nulla "terminata", ma ha un carattere nullo nel mezzo, printf("%.*s", length, string); non funziona come previsto. Questo perché la stringa di formato %.*s chiede printf per stampare un massima di length personaggi, non esattamentelength caratteri.

Preferisco utilizzare la soluzione più generale sottolineato da @William Pursell in un commento sotto la OP:

fwrite(string, sizeof(char), length, stdout); 

Ecco un esempio di codice:

#include <stdio.h> 

int main(void) { 
    size_t length = 5; 

    char string[length]; 
    string[0] = 'A'; 
    string[1] = 'B'; 
    string[2] = 0;  // null character in the middle 
    string[3] = 'C'; 
    string[4] = 'D'; 

    printf("With printf: %.*s\n", length, string); 
    printf("With fwrite: "); 
    fwrite(string, sizeof(char), length, stdout); 
    printf("\n"); 

    return 0; 
} 

uscita:

With printf: AB 
With fwrite: AB CD 
+1

'sizeof (char)' è 1 per definizione. Inoltre, 'NULL' è specificamente una costante * puntatore nullo *. –

+0

@KeithThompson, 'sizeof (char)' è più semantico. Inoltre, ''\ 0'' è più semantico di' 0'. Ma a chi importa ;-) –