7
votes

Comment utiliser la fonction de sous-chaîne en C?

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?


0 commentaires

7 Réponses :


6
votes

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);


1 commentaires

strncpy () , malgré son nom, a été conçu pour fonctionner avec des tableaux de caractères non définis. Votre code peut laisser new_str sans '\ 0'. Ajouter new_str [str_size] = 0 ou assurez-vous de disposer de suffisamment d'espace et d'utiliser strcpy () .



6
votes

Vous pouvez utiliser la fonction memcpy () dans string.h fichier d'en-tête.

memcpy () 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 xxx

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.

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 Memmove () , décrite ensuite pour gérer les blocs de mémoire qui se chevauchent. memcpy () sera démontré dans le programme ci-dessous.

Vous pouvez également trouver un exemple de cette fonction ici: http://www.java-samples.com/showtutorial.php?tutorialID=591


0 commentaires

0
votes

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;
}


2 commentaires

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.



2
votes

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.


0 commentaires

2
votes
char t[255]="";
substr(s, a, b, t);

0 commentaires

1
votes

s + 4

Ceci fournit la sous-chaîne, comme demandé dans la question, pas une copie de la sous-chaîne. ' s + 4 ' 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.

si la demande nécessite une copie locale du résultat, par exemple. Si le résultat sera modifié: xxx

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, Char * Substring = (char *) Malloc (SHLEN (S) -3); ), qui fonctionne sur n'importe quel compilateur C. / p>


0 commentaires

1
votes

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 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: xxx

Ceci prendrait la chaîne d'entrée Instring , extrayez la sous-chaîne de la longueur len à partir de la position POS et renvoyez-la comme une nouvelle chaîne.

mais la question de 64 000 $ est, comment allait-il renvoyer la nouvelle chaîne < / em>?

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 STRUP , et ce n'est même pas une fonction C standard.)

Il pourrait insérer un "\ 0" Chariat dans Instring < / Code> puis renvoyez un pointeur dans Instring , mais cela modifierait évidemment instructions , quelle fonction de ce type ne devrait pas faire. (En effet, c'est pourquoi j'ai spéculé que la fonction hypothétique substr est ici accepterait un "code> const char * pointeur.)

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.

Tout cela est une conséquence de Le fait que c n'a pas de type de chaîne de première classe.

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 substraire à 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.

Si l'appelant est confortable de modifier la chaîne d'origine, il est simple de le faire: xxx

si l'appelant veut allouer de la mémoire séparée, soit en tant que tableau, soit en appelant malloc , c'est aussi assez simple: xxx

donc si c avait un type de chaîne de première classe , il aurait certainement une fonction substr dans sa bibliothèque standard - mais comme ça ne le fait pas, cela ne le fait pas. (C ++, par contraste, est avoir une chaîne de caractères de premier CLSS , et il dispose d'une méthode substr pour aller avec elle.)


0 commentaires