9
votes

Trouver des personnages dans la chaîne C

Je cherche un personnage à la première occurrence dans la chaîne en utilisant le code suivant. Mais il prend du temps quand le personnage est trop long ou le personnage que je suis La recherche est à l'étranger qui retarde les autres opérations. Comment pourrais-je aborder ce problème? Le code est ci-dessous ici.

Remarque: attrptr code> est un char * code> qui contient une référence à une chaîne contenant '"" code> Grandez l'étendue. P>

int position = 0;

char qolon = '"';//character to search

while (*(attrPtr + position++) != qolon);

char* attrValue = NULL;

attrValue = (char*)malloc(position * sizeof(char));

strncpy(attrValue, attrPtr, position-1);

c

0 commentaires

5 Réponses :


26
votes

Strchr code> sera généralement un peu plus rapide. De plus, vous devez rechercher le terminateur Nul, que Strchr vous gérera pour vous.

char *quotPtr = strchr(attrPtr, qolon);
if(quotPtr == NULL)
{
  ... // Handle error
}
int position = quotPtr - attrPtr;
char* attrValue = (char*) malloc((position + 1) * sizeof(char));
memcpy(attrValue, attrPtr, position);
attrValue[position] = '\0';


3 commentaires

Nul est le moniker ASCII, la norme C utilise le terme "caractère null".


Il ne sert à rien d'utiliser strncpy () car vous connaissez déjà le nombre exact de caractères à copier - vous pouvez aussi bien utiliser memcpy () , qui devrait être plus efficace.


Il n'y a pas besoin de lancer malloc (). Tailleof (Char) est toujours 1.



2
votes

Il nécessite un algorithme O (n) pour rechercher un caractère dans la chaîne. Donc, vous ne pouvez pas faire beaucoup mieux que ce que vous faites déjà. Notez également que vous manquez MEMSET (Attment, 0, Position); , sinon votre chaîne Attvalue ne sera pas terminée null.


0 commentaires

7
votes

C a une fonction intégrée pour la recherche d'un caractère dans une chaîne - Strchr () . Strchr () Renvoie un pointeur sur le caractère trouvé, pas la position de la matrice, vous devez donc soustraire le pointeur au début de la chaîne du pointeur retourné pour obtenir cela. Vous pouvez réécrire votre fonction comme suit: xxx

Cela peut être plus rapide que votre original par un petit facteur constant; Cependant, vous n'allez pas obtenir une vitesse d'ordre de la magnitude. La recherche d'un caractère dans une chaîne non ordonnée est fondamentalement O (n) dans la longueur de la chaîne.


0 commentaires

2
votes

L'algorithme que vous avez affiché ne manipule pas correctement le cas où le personnage n'existe pas dans la chaîne. Si cela se produit, il sera juste merilly en mars à travers la mémoire jusqu'à ce qu'il soit au hasard pour trouver un octet qui correspond à votre char ou que vous soufflez au-delà de votre mémoire allouée et obtenez un Segfault. Je soupçonne que c'est pourquoi il semble "prendre trop longtemps" parfois.

in c, les chaînes sont généralement terminées avec un 0 (ASCII NUL ou '\ 0' ). Alternativement, si vous connaissez la longueur de la chaîne à l'avance, vous pouvez l'utiliser.

Bien sûr, il existe une routine de bibliothèque C standard qui fait exactement ceci: strchr () . Un programmeur sage utiliserait cela plutôt que des punaises de risque en roulant leur propre.


0 commentaires

4
votes

Deux choses importantes:

1) Vérifiez toujours un terminateur NULL lors de la recherche d'une chaîne de cette façon: p> xxx pré>

devrait être: p>

char buf[512];
strncpy(buf,"",4096);


0 commentaires