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?
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?
#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
@pib: otherString [5] = '\ 0'; –
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
Merci de me rappeler de placer le caractère de terminaison dans des guillemets simples placés entre guillemets. – Seagull
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
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. –
// Merci, vous avez raison à propos de la mauvaise syntaxe ... Correction du code. Cependant, l'algorithme est toujours valable, voir la mise à jour. – Liao
N'oubliez pas de libérer après malloc – ShihabSoft
strncpy(otherString, someString, 5);
Ne pas oublier d'allouer de la mémoire pour otherString.
Notez que cela peut entraîner une chaîne non terminée (si 'someString' contient cinq caractères ou plus). – strager
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().
#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.
Vous devez définir otherString [5] = '\ 0' ainsi –
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
Ou vous pouvez memset (otherstring, '\ 0', sizeof (otherstring)); avant de l'utiliser. – HeretoLearn
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);
}
il vaudra mieux ajouter '\ 0' à dest [len + 1] non? – JoseLinares
Faire tout en deux est tombé swoops:
char *otherString = strncpy((char*)malloc(6), someString);
otherString[5] = 0;
ne jamais le faire. vous devez vérifier que le malloc a fonctionné. – pm100
@ pm100 Je suis d'accord mais personne d'autre n'était, donc j'ai pensé que c'était implicite. –
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
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;
}
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 .
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
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