strsep() utilisation et ses alternatives
#include <stdio.h>
#include <string.h>
int main() {
char *slogan = "together{kaliya} [namak]";
char *slow_gun = strdup(slogan);
char *token = strsep(&slow_gun, "{");
printf ("\n slow_gun: %s\n token: %s\n", slow_gun, token);
return 0;
}
quand je l'exécuter:
$ cc -o try try_strsep.c
$ ./try
slow_gun: kaliya} [namak]
token: together
Mais quand, j'ai changer de char *slogan:
char *slogan = "kalia} [namak]";
et exécutent le même programme:
$ vi try_strsep.c
$ cc -o try try_strsep.c
$ ./try
slow_gun: (null)
token: kalia} [namak]
Mon Question est, donc, lorsque j'utilise strsep() et de la chaîne d'entrée n'ont pas le modèle que je suis à la recherche d', le retour de strsep() est mal. La seule façon que je peux valider si strsep() n'a pas pu trouver le modèle est de vérifier if (slow_gun == NUll)
.
Si j'ai char *slogan = "together{"
puis strsep
avec succès revenir token
mais renvoie slow_gun
à vide (pas null
)
$ cc -o try try_strsep.c
$ ./try
slow_gun:
token: together
Est-il un moyen que je pouvais éviter ce CAS de vérifier et de s'appuyer sur la fonction pour retourner me le substr et si elle n'est pas là, de retour NULL
?
Vous devez
Vous m'avez eu en larmes. Je suis d'accord pour vous, mais est-ce que cela va m'aider avec ma question?
Aider quelqu'un à éviter les fuites de mémoire est toujours utile 🙂 Ma réponse ci-dessous devrait vous aider avec votre question.
Vous m'a fait penser à cette conférence goo.gl/ks0Oe 🙂
free
la chaîne de caractères retournée par strdup
Vous m'avez eu en larmes. Je suis d'accord pour vous, mais est-ce que cela va m'aider avec ma question?
Aider quelqu'un à éviter les fuites de mémoire est toujours utile 🙂 Ma réponse ci-dessous devrait vous aider avec votre question.
Vous m'a fait penser à cette conférence goo.gl/ks0Oe 🙂
OriginalL'auteur hari | 2011-07-28
Vous devez vous connecter pour publier un commentaire.
Non, il n'y a aucun moyen d'éviter la case
slow_gun == NULL
. Voici une description destrsep
comportement:Donc, si aucune correspondance n'est trouvée
strsep
retourne un pointeur vers la chaîne d'origine et définit laslow_gun
d'entrée à la valeur NULL.Si le délimiteur est le dernier caractère de la chaîne, ce caractère est remplacé par '\0' et
slow_gun
est la suivante personnage, qui se trouve être le '\0' de terminaison de la chaîne d'origine. C'est pourquoi l'instruction print imprime une chaîne vide.NOTE Vous utilisez
strdup
de manière incorrecte, l'appelant est responsable de l'appelfree
sur le pointeur retourné par cette fonction.OriginalL'auteur Praetorian
C'est pas bon.
strsep()
retourne le premier élément qu'il trouve le début de la chaîne est, par définition, le premier jeton. C'est juste que pas de délimiteur a été trouvé pour mettre fin à l'jeton dans ce cas (si le reste de la chaîne est le jeton).strsep()
n'est pas destiné à être utilisé pour trouver un modèle de' - il est utilisé pour séparer les jetons basés sur un ensemble de séparateurs. Si vous voulez trouver un caractère, utilisezstrchr()
oustrpbrk()
.OriginalL'auteur Michael Burr
strsep est de se comporter correctement à partir de la page de man:
Le second cas est correct - depuis le délimiteur n'est pas trouvé, le premier paramètre est défini à point à
NULL
et la chaîne d'origine est retourné. Comme vous le dites, vous avez besoin de vérifier pourif (slow_gun == NUll)
à détecter ce.(d'ailleurs, c'est une horrible confusion choix des noms de variables).
OriginalL'auteur John Carter