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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top