2010-01-22 14 views
40

ho una stringa:Stringhe in C, come ottenere sottoStringa

char * someString; 

Se voglio le prime cinque lettere di questa stringa e voglio impostarlo otherString, come lo farei?

+4

someString non è una stringa, è un puntatore a una stringa di caratteri. Inoltre, i caratteri non sono necessariamente lettere. Devi sapere cos'è una stringa prima di spostare le lettere. – jbcreix

+0

In base alle proprie esigenze è meglio dichiarare un array di caratteri di dimensione 6 per othertring (5 + un byte per '\ 0'). In questo modo non ti devi preoccupare delle perdite di memoria in caso dimentichi di liberare othertring dopo averlo utilizzato. – HeretoLearn

risposta

42
#include <string.h> 
... 
char otherString[6]; // note 6, not 5, there's one there for the null terminator 
... 
strncpy(otherString, someString, 5); 
otherString[5] = '\0'; // place the null terminator 
+3

@pib: otherString [5] = '\ 0'; –

+3

Oppure 'otherString [5] = (char) 0;' Se vuoi essere pignolo a riguardo. Char è un tipo intero, quindi i compilatori non si lamenteranno (o non dovrebbero) di limitarsi ad assegnare un intero non elaborato ad esso. – pib

+0

Grazie per avermi ricordato di posizionare il carattere di terminazione tra virgolette singole con virgolette doppie. – Seagull

6
char* someString = "abcdedgh"; 
char* otherString = 0; 

otherString = (char*)malloc(5+1); 
memcpy(otherString,someString,5); 
otherString[5] = 0; 

UPDATE:
Suggerimento: Un buon modo per capire le definizioni è chiamata la regola destra-sinistra (alcuni link alla fine):

iniziare a leggere da identificatore e dire ad alta voce = > "someString is ..."
Ora vai a destra di someString (l'istruzione è terminata con un punto e virgola, nulla da dire).
Ora vai a sinistra dell'identificatore (* si incontra) => quindi dì "... un puntatore a ...".
Ora andare a sinistra di "*" (la parola chiave char è stata trovata) => pronunciare "..char".
Fatto!

Quindi char* someString; => "someString è un puntatore al carattere".

Poiché un puntatore punta semplicemente su un determinato indirizzo di memoria, può anche essere utilizzato come "punto di partenza" per un "array" di caratteri.

che funziona con qualsiasi cosa .. dare un andare:

char* s[2]; //=> s is an array of two pointers to char 
char** someThing; //=> someThing is a pointer to a pointer to char. 
//Note: We look in the brackets first, and then move outward 
char (* s)[2]; //=> s is a pointer to an array of two char 

Alcuni link: How to interpret complex C/C++ declarations e How To Read C Declarations

+1

Penso che dovresti provare a compilare 'char * [] someThing;' e 'char [] * someThing;'. Vuoi 'char * someThing [];' e 'char (* someThing) [];' rispettivamente. E questo interrompe il tuo algoritmo per capire le definizioni. –

+0

// Grazie, hai ragione riguardo alla cattiva sintassi .. risolto il codice. Tuttavia, l'algoritmo rimane valido, consultare l'aggiornamento. – Liao

+0

Non dimenticare di liberare dopo malloc – ShihabSoft

0
strncpy(otherString, someString, 5); 

Non dimenticate di allocare memoria per otherString.

+2

Si noti che ciò potrebbe causare una stringa non terminata (se 'someString' contiene cinque o più caratteri). – strager

3

È necessario allocare memoria per la nuova stringa otherString. In generale, per una sottostringa di lunghezza n, qualcosa di simile può funzionare per voi (non dimenticate di fare il controllo dei limiti ...)

char *subString(char *someString, int n) 
{ 
    char *new = malloc(sizeof(char)*n+1); 
    strncpy(new, someString, n); 
    new[n] = '\0'; 
    return new; 
} 

Ciò restituirà una sottostringa dei primi n caratteri di someString. Assicurati di liberare la memoria quando hai finito con free().

+0

controllare il valore di ritorno di malloc – pm100

+0

... o qualcosa di completamente nuovo ... 'char * new = new char [n + 1]' :-) – dolphin

0
#include <stdio.h> 
#include <string.h> 

int main() 
{ 
     char someString[]="abcdedgh"; 
     char otherString[]="00000"; 
     memcpy (otherString, someString, 5); 
     printf ("someString: %s\notherString: %s\n", someString, otherString); 
     return 0; 
} 

Non sarà necessario stdio.h se non si utilizza l'istruzione printf e costanti mettendo in tutti, ma i programmi più piccoli è cattiva forma e dovrebbero essere evitati.

+0

È necessario anche impostare otherString [5] = '\ 0' –

+0

othertring dopo la memcpy non è una stringa C valida poiché non è terminata nulla. Dopo la memcpy è necessario aggiungere otherstring [5] = '\ 0'; – HeretoLearn

+0

Oppure puoi memset (otherstring, '\ 0', sizeof (otherstring)); prima di usarlo. – HeretoLearn

5

generalizzato:

char* subString (const char* input, int offset, int len, char* dest) 
{ 
    int input_len = strlen (input); 

    if (offset + len > input_len) 
    { 
    return NULL; 
    } 

    strncpy (dest, input + offset, len); 
    return dest; 
} 

char dest[80]; 
const char* source = "hello world"; 

if (subString (source, 0, 5, dest)) 
{ 
    printf ("%s\n", dest); 
} 
+0

sarà meglio se aggiungi '\ 0' a dest [len + 1] no? – JoseLinares

0

fare tutto in due è sceso piomba:

char *otherString = strncpy((char*)malloc(6), someString); 
otherString[5] = 0; 
+0

non farlo mai. devi controllare che il malloc abbia funzionato. – pm100

+0

@ pm100 Mi capita di essere d'accordo ma nessun altro era, quindi ho pensato che fosse implicito. –

0
char largeSrt[] = "123456789-123"; // original string 

char * substr; 
substr = strchr(largeSrt, '-');  // we save the new string "-123" 
int substringLength = strlen(largeSrt) - strlen(substr); // 13-4=9 (bigger string size) - (new string size) 

char *newStr = malloc(sizeof(char) * substringLength + 1);// keep memory free to new string 
strcpy(newStr, largeSrt, substringLength); // copy only 9 characters 
newStr[substringLength] = '\0'; // close the new string with final character 

printf("newStr=%s\n", newStr); 

free(newStr); // you free the memory 
0

Penso che sia così facile ... ma non so come posso passare il risultato variabile direttamente quindi creo un array di caratteri locali come temp e lo restituisco.

char* substr(char *buff, uint8_t start,uint8_t len, char* substr) 
{ 
    strncpy(substr, buff+start, len); 
    substr[len] = 0; 
    return substr; 
} 
0

È possibile utilizzare snprintf per ottenere una sottostringa di un array di caratteri con precisione. Ecco un esempio di file chiamato "substring.c":

#include <stdio.h> 

int main() 
{ 
    const char source[] = "This is a string array"; 
    char dest[17]; 

    // get first 16 characters using precision 
    snprintf(dest, sizeof(dest), "%.16s", source); 

    // print substring 
    puts(dest); 
} // end main 

uscita:

Questa è una stringa

Nota:

Per ulteriori informazioni consultare la pagina man printf .