J'ai une fonction C, qui prend une chaîne appelée «tampon» et analyse, il correspondra aux mots-clés et à l'utiliser pour affecter des valeurs dans une structure.
Cependant, certains mots-clés que je veux ignorer complètement. p>
Ce programme analyse des fichiers vCard (.vcf, cartes de visite virtuelles). p>
Voici un exemple de tampon de ligne peut fournir: p>
FN;CHARSET=UTF-8:David Celery
4 Réponses :
Quelqu'un d'autre a une chaîne C recherche et remplace la fonction que vous pourriez trouver utile ici .
Edit: Inclus Code Snippet de lien ci-dessous, selon la demande de commentaire em> p> espère que cela aide. P> P> >
Regardez une simple solution ANSI C comme:
void removeSubstring(char *s,const char *toremove)
{
while( s=strstr(s,toremove) )
memmove(s,s+strlen(toremove),1+strlen(s+strlen(toremove)));
}
Je reçois des avertissements et un Segfault essayant d'utiliser ce code. Y a-t-il une erreur quelque part? J'utilise C99 si cela compte.
Si vous avez enregistré Strlen (Toremove) Code> Il serait plus efficace - pas besoin de le déterminer deux fois par boucle.
la performance n'était pas la question; Ce code fonctionne bien aussi pour plus d'occurrences, je pense que c'est votre problème de votre compilateur
@ user411313. Je suis d'accord avec Thiefmaster, les manuels sont pleins d'exemples terribles b>. Pourquoi ne pas publier de code plus efficace et propre ici. Cela peut même rendre votre réponse à une meilleure cible pour uppote.
@ user411313 @thiefmaster: En réalité, cela n'a pas d'importance - c'est toujours un algorithme de O (m n ^ 2), que l'appel de Strlen soit mis en cache. Il serait préférable d'utiliser l'algorithme O (m i> N) pour cela, mais c'est un peu plus compliqué.
Afin de se débarrasser de ce Avertissement: suggère des parenthèses autour de l'affectation utilisée comme valeur de vérité [-wparentheses] code> Je devais utiliser tandis que ((S = strstr (s, toremove))) code>.
Je n'obtiens pas comment cela fonctionne peut-être que quelqu'un veuille expliquer, j'ai également utilisé MemMove pour résoudre un problème similaire, mais je lui donne la position exacte dans le tableau de caractères de la source et la destination et la taille des octets de déplacement dépasse la taille de la taille de la la source. E.G- Memmove (S + Pos, S + Pos + Strlen (Toremove), (SHLEN (S) -POS)); Lorsque POS est la position de la première occurrence de Toremove que nous traversons Strstr.
Au lieu de les retirer, vous pouvez simplement les ignorer, par exemple comme ceci:
#define KEY_TO_IGNORE "CHARSET=UTF-8"
char key[80];
char value[80];
char *text = "FN;CHARSET=UTF-8:David Celery";
sscanf(text, "%2s;" KEY_TO_IGNORE ":%s", key, value);
printf("key: %s, value: %s\n", key, value);
Je ne pensais pas que nous essayions de résoudre tous les problèmes du monde, donnez simplement des suggestions quant à l'approche, mais YMMV.
Qu'avez-vous essayé jusqu'à présent? Et si vous travaillez avec des chaînes en C et que vous n'êtes pas en mesure de faire quelque chose de basique, alors je vous suggère de considérer avec une langue avec un support de chaîne intégré (E.G. C ++, Java, C #, Python, Delphi, etc.)