2010-01-22 6 views
40

J'ai une chaîne:Cordes en C, comment obtenir sousChaîne

char * someString; 

Si je veux que les cinq premières lettres de cette chaîne et que vous souhaitez le mettre à otherString, comment pourrais-je le faire?

+4

someString n'est pas une chaîne, c'est un pointeur vers une chaîne de caractères. De plus, les caractères ne sont pas nécessairement des lettres. Vous devez savoir ce qu'est une chaîne avant de déplacer les lettres. – jbcreix

+0

Selon votre besoin, il est préférable de déclarer un tableau char de taille 6 pour otherstring (5 + un octet pour '\ 0'). De cette façon, vous n'avez pas à vous soucier des fuites de mémoire, au cas où vous oublieriez de libérer les autres chaînes après l'avoir utilisé. – HeretoLearn

Répondre

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

Ou 'otherString [5] = (char) 0;' Si vous voulez être pointilleux à ce sujet. Char est un type entier, donc les compilateurs ne se plaindront pas (ou ne devraient pas) de simplement lui assigner un entier brut. – pib

+0

Merci de me rappeler de placer le caractère de terminaison dans des guillemets simples placés entre guillemets. – Seagull

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

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

MISE À JOUR:
Astuce: Une bonne façon de comprendre les définitions est appelée la règle de droite à gauche (certains liens à la fin):

Commencez à lire à partir identifiant et dire à haute voix = > "someString est ..."
Maintenant, allez à droite de someString (la déclaration s'est terminée par un point-virgule, rien à dire).
Maintenant allez à gauche de l'identifiant (* est rencontré) => alors dites "... un pointeur vers ...".
Maintenant, allez à gauche de "*" (le mot-clé char est trouvé) => dites "..char".
Fait!

Donc char* someString; => "someString est un pointeur sur char".

Puisqu'un pointeur pointe simplement sur une certaine adresse mémoire, il peut également être utilisé comme "point de départ" pour un "tableau" de caractères.

qui fonctionne avec quoi que ce soit .. donner un aller:

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 

Quelques liens: How to interpret complex C/C++ declarations et How To Read C Declarations

+1

Je pense que vous devriez essayer de compiler 'char * [] someThing;' et 'char [] * someThing;'. Vous voulez 'char * someThing [];' et 'char (* someThing) [];' respectivement. Et cela brise votre algorithme pour comprendre les définitions. –

+0

// Merci, vous avez raison à propos de la mauvaise syntaxe ... Correction du code. Cependant, l'algorithme est toujours valable, voir la mise à jour. – Liao

+0

N'oubliez pas de libérer après malloc – ShihabSoft

0
strncpy(otherString, someString, 5); 

Ne pas oublier d'allouer de la mémoire pour otherString.

+2

Notez que cela peut entraîner une chaîne non terminée (si 'someString' contient cinq caractères ou plus). – strager

3

Vous devez allouer de la mémoire pour la nouvelle chaîne otherString. En général, pour une sous-chaîne de longueur n, quelque chose comme cela peut fonctionner pour vous (ne pas oublier de faire des bornes Checking ...)

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

Ceci renvoie une sous-chaîne des n premiers caractères de someString. Assurez-vous de libérer la mémoire quand vous en avez fini avec free().

+0

s'il vous plaît vérifier la valeur de retour malloc – pm100

+0

... ou quelque chose de complètement nouveau ... 'char * nouveau = nouveau 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; 
} 

Vous ne aurez pas besoin stdio.h si vous n'utilisez l'instruction printf et mettre des constantes dans l'ensemble, mais les programmes les plus petits est mauvaise forme et devrait être évitée.

+0

Vous devez définir otherString [5] = '\ 0' ainsi –

+0

othertring après que memcpy n'est pas une chaîne C valide car elle n'est pas terminée par null. Après le memcpy vous devez ajouter otherstring [5] = '\ 0'; – HeretoLearn

+0

Ou vous pouvez memset (otherstring, '\ 0', sizeof (otherstring)); avant de l'utiliser. – HeretoLearn

5

Généralisée:

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

il vaudra mieux ajouter '\ 0' à dest [len + 1] non? – JoseLinares

0

Faire tout en deux est tombé swoops:

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

ne jamais le faire. vous devez vérifier que le malloc a fonctionné. – pm100

+0

@ pm100 Je suis d'accord mais personne d'autre n'était, donc j'ai pensé que c'était implicite. –

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

Je pense qu'il est moyen facile ... mais je ne sais pas comment je peux passer la La variable de résultat directement puis je crée un tableau char local comme temp et le renvoie.

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

Vous pouvez utiliser snprintf pour obtenir une sous-chaîne d'un tableau de caractères avec précision. Voici un exemple de fichier appelé "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 

Sortie:

Ceci est une chaîne

Note:

Pour plus d'informations, voir la page man printf .