J'ai une chaîne et je veux sa sous-chaîne du 5ème emplacement pour le dernier emplacement. Quelle fonction dois-je utiliser? P>
7 Réponses :
Si vous n'utilisez pas la chaîne d'origine pour quoi que ce soit d'autre, vous pouvez simplement utiliser & s [4] code> directement. Si vous avez besoin d'une copie, faites
char new_str[STR_SIZE + 1] = {0};
strncpy(new_str, &s[4], STR_SIZE);
strncpy () code>, malgré son nom, a été conçu pour fonctionner avec des tableaux de caractères non définis. Votre code peut laisser
new_str code> sans '\ 0'. Ajouter
new_str [str_size] = 0 code> ou assurez-vous de disposer de suffisamment d'espace et d'utiliser
strcpy () code>.
Vous pouvez utiliser la fonction Les arguments Dest et SRC point sur les blocs de la mémoire de destination et de source, respectivement. Compte Spécifie le nombre d'octets à copier. La valeur de retour est DEST. p> Si les deux blocs de la mémoire se chevauchent, la fonction peut ne pas fonctionner correctement - certaines des données de SRC peuvent être écrasées avant d'être copiés. Utilisez la fonction Vous pouvez également trouver un exemple de cette fonction ici: http://www.java-samples.com/showtutorial.php?tutorialID=591 P> P> memcpy () code> dans
string.h code> fichier d'en-tête.
memcpy () code> copie des octets de Données entre les blocs de mémoire, parfois appelé tampons. Cette fonction ne se soucie pas du type de données copiées - elle fait simplement une copie exacte de l'octet. Le prototype de fonction est p>
Memmove () code>, décrite ensuite pour gérer les blocs de mémoire qui se chevauchent.
memcpy () code> sera démontré dans le programme ci-dessous. p>
Si je comprends correctement, vous devez utiliser un délimiteur, afin de rompre la chaîne en substrings. Par exemple "Un # deux # trois" brisé dans un deux trois. Si oui:
#include <stdio.h> #include <string.h> int main() { char test[] = "one#two#three"; char* res; res = strtok(test, "#"); while(res) { printf("%s\n", res); res = strtok(NULL, "#"); } return 0; }
Je n'ai pas de délimiteur et je ne veux aussi pas écrire de codes supplémentaires car il serait considéré comme une redondance. Je veux utiliser une fonction de bibliothèque.
Strtok () est la fonction de bibliothèque, mais j'ai mal compris votre question afin que mon message soit sans importance. Pardon.
Si vous connaissez le caractère également dans la chaîne d'où vous souhaitez obtenir la sous-chaîne, vous pouvez utiliser la fonction STRSTR. Il localise la sous-chaîne. Mais si vous ne connaissez pas le personnage de l'endroit où vous souhaitez récupérer, vous pouvez utiliser la chaîne Strcpy ou Strncpy pour obtenir la chaîne comme l'a mentionné Eric. P>
char t[255]=""; substr(s, a, b, t);
Ceci fournit la sous-chaîne, comme demandé dans la question, pas une copie de la sous-chaîne. ' si la demande nécessite une copie locale du résultat, par exemple. Si le résultat sera modifié: p> Notez que cela nécessite un compilateur C moderne qui permet des réseaux de taille variable. Pour une copie non locale, utilisez MALLOC pour allouer la sous-chaîne (par exemple, s + 4 code>
s + 4 code>' renvoie la sous-chaîne à la 5ème position de la chaîne 'S'. Il s'agit d'une opération primitive efficace en C et n'utilise aucun appels de fonction. P>
Char * Substring = (char *) Malloc (SHLEN (S) -3); code>), qui fonctionne sur n'importe quel compilateur C. / p> p>
Au lieu de vous dire comment extraire une sous-chaîne (quelles autres réponses ont déjà effectuées), je vais expliquer pourquoi c est pas em> une fonction de sous-chaîne standard. Si c Avoir une fonction de sous-chaîne, sa déclaration pourrait ressembler à quelque chose comme ceci: p> Ceci prendrait la chaîne d'entrée mais la question de 64 000 $ est, comment allait-il renvoyer la nouvelle chaîne < / em>? p> Il pourrait allouer de manière dynamique de l'espace pour la nouvelle chaîne, mais les fonctions d'utilité de C de C ne font généralement jamais cela. (La seule exception qui se déroule à l'esprit est Il pourrait insérer un "\ 0" Chariat dans donc il s'avère que cela s'avère que cela s'avère qu'il s'avère donc donc en C, il est en fait impossible d'écrire une fonction de sous-chaîne "utilitaire" appropriée qui ne fait aucune allocation de mémoire dynamique et qui ne modifie pas la chaîne d'origine. p> Tout cela est une conséquence de Le fait que c n'a pas de type de chaîne de première classe. P> C'est correctement la décision de l'appelant, qu'il soit acceptable de modifier la chaîne d'origine. C'est correctement la décision de l'appelant comment allouer la mémoire pour la sous-chaîne extraite. Donc, il reste presque tout ce qui reste pour la fonction hypothétique Si l'appelant est confortable de modifier la chaîne d'origine, il est simple de le faire: p> si l'appelant veut allouer de la mémoire séparée, soit en tant que tableau, soit en appelant donc si c avait un type de chaîne de première classe , il aurait certainement une fonction code> substr code> dans sa bibliothèque standard - mais comme ça ne le fait pas, cela ne le fait pas. (C ++, par contraste, est em> avoir une chaîne de caractères code> de premier CLSS CODE>, et il dispose d'une méthode code> substr code> pour aller avec elle.) p> p> Instring code>, extrayez la sous-chaîne de la longueur
len code> à partir de la position
POS code> et renvoyez-la comme une nouvelle chaîne. p>
STRUP code>, et ce n'est même pas une fonction C standard.) P>
Instring < / Code> puis renvoyez un pointeur dans
Instring code>, mais cela modifierait évidemment
instructions code>, quelle fonction de ce type ne devrait pas faire. (En effet, c'est pourquoi j'ai spéculé que la fonction hypothétique
substr code> est ici accepterait un "code> const char * cod> pointeur.) P>
substraire code> à faire. C'est juste un peu de pointeur arithmétique, et il pourrait être agréable d'encapsuler dans une fonction "substratrice", mais cela ne finit pas vraiment d'enregistrer l'appelant, de sorte que l'appelant pourrait aussi bien faire le pointeur arithmétique, après avoir décidé comment il veut gérer ces problèmes plus difficiles. P>
malloc code>, c'est aussi assez simple: p>