Il modo più semplice di stampare una porzione di un carattere [] in C
-
05-07-2019 - |
Domanda
Diciamo che ho un char * str = " 0123456789 "
e voglio tagliare la prima e le ultime tre lettere e stampare solo al centro, qual è il modo più semplice e sicuro di farlo?
Ora il trucco: la porzione da tagliare e la porzione da stampare sono di dimensioni variabili, quindi potrei avere un carattere molto lungo * o molto piccolo.
Soluzione
Puoi usare printf ()
e una stringa di formato speciale:
char *str = "0123456789";
printf("%.6s\n", str + 1);
La precisione nello specificatore di conversione % s
specifica il numero massimo di caratteri da stampare. Puoi anche utilizzare una variabile per specificare la precisione in fase di esecuzione:
int length = 6;
char *str = "0123456789";
printf("%.*s\n", length, str + 1);
In questo esempio, * viene utilizzato per indicare che l'argomento successivo ( lunghezza
) conterrà la precisione per la conversione % s
, l'argomento corrispondente deve essere un int
.
L'aritmetica del puntatore può essere utilizzata per specificare la posizione iniziale come ho fatto sopra.
[EDIT]
Un altro punto, se la stringa è più corta del tuo identificatore di precisione, verranno stampati meno caratteri, ad esempio:
int length = 10;
char *str = "0123456789";
printf("%.*s\n", length, str + 5);
Stampa " 56789
" ;. Se vuoi sempre stampare un certo numero di caratteri, specifica sia una larghezza minima del campo sia una precisione:
printf("%10.10s\n", str + 5);
o
printf("%*.*s\n", length, length, str + 5);
che stamperà:
" 56789"
Puoi usare il segno meno per giustificare a sinistra l'output nel campo:
printf("%-10.10s\n", str + 5);
Infine, la larghezza minima del campo e la precisione possono essere diverse, ad esempio
printf("%8.5s\n", str);
stamperà al massimo 5 caratteri giustificati a destra in un campo di 8 caratteri.
Altri suggerimenti
Robert Gamble e Steve hanno separatamente la maggior parte dei pezzi. Assemblato in un intero:
void print_substring(const char *str, int skip, int tail)
{
int len = strlen(str);
assert(skip >= 0);
assert(tail >= 0 && tail < len);
assert(len > skip + tail);
printf("%.*s", len - skip - tail, str + skip);
}
Invocazione per l'esempio:
print_substring("0123456789", 1, 3);
Se non ti dispiace modificare i dati, potresti semplicemente fare un po 'di aritmetica con i puntatori. Ciò presuppone che str sia un puntatore a caratteri e non un array:
char string[] = "0123456789";
char *str = string;
str += 3; // "removes" the first 3 items
str[4] = '\0'; // sets the 5th item to NULL, effectively truncating the string
printf(str); // prints "3456"
Ecco una funzione di sottostringa pulita e semplice che ho estratto dalla mia libreria personale che può essere utile:
char *
substr(const char *src, size_t start, size_t len)
{
char *dest = malloc(len+1);
if (dest) {
memcpy(dest, src+start, len);
dest[len] = '\0';
}
return dest;
}
Probabilmente è autoesplicativo ma prende una stringa, una posizione iniziale (a partire da zero) e una lunghezza e restituisce una sottostringa della stringa originale o un puntatore nullo se malloc fallisce. Il puntatore restituito può essere gratuito
'd dal chiamante quando la memoria non è più necessaria. Nello spirito di C, la funzione non convalida la posizione iniziale e la lunghezza fornite.
Credo che ci sia un po 'di magia che puoi fare con printf che stamperà solo un certo numero di caratteri, ma non è comunemente compreso o usato. Abbiamo provato a farlo in un lavoro precedente e non siamo riusciti a farlo funzionare in modo coerente.
Quello che vorrei fare è salvare un carattere, annullare quel carattere nella stringa, stamparlo, quindi salvarlo di nuovo.