2011-01-30 30 views
12

Esiste un modo per stampare solo una parte di una stringa?Stampa parte di una stringa in C

Per esempio, se ho

char *str = "hello there"; 

C'è un modo per stampare solo "hello", tenendo presente che la sottostringa voglio stampare è di lunghezza variabile, non sempre 5 caratteri?

So che potrei usare un for loop e putchar o che ho potuto copiare l'array e quindi aggiungere un null-terminator ma mi chiedo se c'è un modo più elegante?

+0

qual è il carattere o criteri si vuole fermare su? è difficile rispondere a questa domanda senza chiarimenti – kelloti

risposta

28

Prova questo:

int length = 5; 
printf("%*.*s", length, length, "hello there"); 
+2

Io ero 7 secondi troppo lento =) – SiegeX

+1

@SiegeX: Yup - aggiungendo il 'include \ nintmain (void) \ n {' sei in ... :-) –

+0

Naturalmente, se vuole stampare su stderr, o su un file, o su un'etichetta in alcune GUI, il classico 'printf' non aiuta. Forse prendi nota anche di sprintf/fprintf? –

14

questo funzionerà anche:

fwrite(str, 1, len, stdout); 

non avrà il sovraccarico di analisi del identificatore di formato. Ovviamente, per regolare l'inizio della sottostringa, è sufficiente aggiungere l'indice al puntatore.

+0

Sebbene io * amo * usando la formattazione in stile 'printf', questa è la risposta più semplice e quindi la più elegante. – dummydev

1

È possibile utilizzare strncpy per duplicare la parte della stringa che si desidera stampare, ma è necessario fare attenzione ad aggiungere un terminatore null, poiché strncpy non lo farà se non ne incontra uno nel stringa di origine. Una soluzione migliore, come ha sottolineato Jerry Coffin, sta utilizzando la funzione *printf appropriata per scrivere o copiare la sottostringa desiderata.

Mentre strncpy può essere pericoloso nelle mani di qualcuno non abituato, può essere più veloce in termini di tempo di esecuzione rispetto ad una soluzione stile printf/sprintf/fprintf, poiché non v'è nessuno del sovraccarico di trattare con il stringhe di formattazione. Il mio suggerimento è di evitare strncpy se puoi, ma è bene sapere per caso.

size_t len = 5; 
char sub[6]; 
sub[5] = 0; 
strncpy(sub, str + 5, len); // char[] to copy to, char[] to copy from(plus offset 
          // to first character desired), length you want to copy 
0

printf e gli amici funzionare bene quando è tutto quello che si vuole fare con la stringa parziale, ma per una soluzione più generale:

char *s2 = s + offset; 
char c = s2[length]; // Temporarily save character... 
s2[length] = '\0'; // ...that will be replaced by a NULL 
f(s2); // Now do whatever you want with the temporarily truncated string 
s2[length] = c;  // Finally, restore the character that we had saved 
+1

Questo darà UB se passi una stringa letterale (che è ciò che l'OP mostra ...) –