2009-07-06 7 views
9

je suis tombé sur un petit problème et ont besoin d'aide:longueur de chaîne entre les pointeurs

Si j'ai un tampon alloué de caractères et j'ai points de début et de fin qui sont quelque part dans ce tampon et je veux la longueur entre ces deux points, comment puis-je le trouver?

i.e.

char * buf; //malloc of 100 chars 
char * start; // some point in buff 
char * end; // some point after start in buf 

int length = &end-&start? or &start-&end? 
//How to grab the length between these two points. 

Merci

Répondre

27

Juste

length = end - start; 

sans esperluette et des moulages. L'arithmétique du pointeur C permet cette opération.

+1

Juste essayé et ça a fonctionné, je ne sais pas pourquoi j'ai commencé à lancer et là-bas. Merci – James

+7

Parce que c'est ce que vous faites quand vous êtes nouveau à C. Ajoutez juste une étoile ou une esperluette et espérons que cela fonctionne cette fois. :-) Accrochez-vous, vous l'aurez. – Thomas

+0

Je n'ai jamais fait ça. Mais je suppose que c'était parce que j'avais une expérience préalable avec peek() et poke(). – Artelius

8

Il est juste le pointeur plus tard moins le pointeur plus tôt.

int length = end - start; 

Code de vérification et de l'échantillon ci-dessous:

int main(int argc, char* argv[]) 
{ 
    char buffer[] = "Its a small world after all"; 
    char* start = buffer+6; // "s" in SMALL 
    char* end = buffer+16; // "d" in WORLD 

    int length = end - start; 

    printf("Start is: %c\n", *start); 
    printf("End is: %c\n", *end); 
    printf("Length is: %d\n", length); 
} 
+4

Vous n'avez pas besoin de lancer vers int - c'est très dangereux, parce que int est signé, donc vous finirez par faire des maths avec deux ints signés plutôt que des pointeurs et le résultat peut différer de ce que vous vous attendez. – qrdl

+0

Je ne pense pas que qrdl a raison. Deux ints signés? Lesquels deux ints signés? La conversion est effectuée sur le résultat de la soustraction, et non sur les deux pointeurs qui sont soustraits. Le résultat de la soustraction de pointeur est signé, tout à fait correctement. Si la fin vient réellement avant le début, alors le résultat devrait être négatif, non? –

0

Cette instruction C calcule la différence entre la fin et le début. Simplement:

int length = (int)(end - start); 
1

Il existe même un type, ptrdiff_t, qui existe pour contenir une telle longueur. Il est fourni par 'stddef.h'

Questions connexes