Per esempio, io ho questoOttenere una sottostringa di un char *
char *buff = "this is a test string";
e voglio ottenere "test"
. Come lo posso fare?
Per esempio, io ho questoOttenere una sottostringa di un char *
char *buff = "this is a test string";
e voglio ottenere "test"
. Come lo posso fare?
char subbuff[5];
memcpy(subbuff, &buff[10], 4);
subbuff[4] = '\0';
lavoro fatto :)
Supponendo che si conosce la posizione e la lunghezza della stringa:
char *buff = "this is a test string";
printf("%.*s", 4, buff + 10);
si potrebbe ottenere la stessa cosa copiando la stringa ad un'altra destinazione di memoria, ma non è ragionevole, dal momento che già avete in memoria.
Questo è un buon esempio di evitare la copia non necessaria utilizzando i puntatori.
@procrastinator: non solo per la stampa. Questo è un approccio praticabile nel caso in cui la sottostringa non verrà modificata. In questo modo è sufficiente mantenere una coppia di puntatori invece di allocare un buffer di lunghezza variabile. –
N̶i̶c̶e̶ ̶o̶n̶e̶ ̶f̶o̶r̶ ̶p̶r̶i̶n̶t̶i̶n̶g̶ ̶o̶n̶l̶̶̶̶y̶ Scusa se mi sbagli, voglio dire che la tua soluzione non richiede una stringa aggiuntiva, che è perfetta quando hai solo bisogno di stampare :-) – leaf
usa sprintf per memorizzare la stringa precedentemente formattata –
Si può semplicemente utilizzare strstr()
da <string.h>
Vedere il commento di Grault sotto –
Usa char* strncpy(char* dest, char* src, int n)
da <cstring>
. Nel tuo caso è necessario utilizzare il seguente codice:
char* substr;
strncpy(substr, buff+10, 4);
La documentazione completa sulla funzione herestrncpy
.
Questa volontà sprecare memoria. Sei stato avvertito! : P – alexandernst
@alexandernst: esattamente? 5 byte allocati nello stack (che verranno liberati quando non rientrano nello scope) non fanno altro sprecare memoria ... – Goz
Ancora più di quello che ti serve, ma sì, si libereranno non appena il codice lascia il codice stack attuale. – alexandernst