2009-07-06 16 views
9

mi sono imbattuto in un piccolo problema e hanno bisogno di un certo aiuto:lunghezza della stringa tra puntatori

Se ho un buffer allocato di caratteri e ho un inizio e di fine i punti che sono da qualche parte dentro questo buffer e voglio la lunghezza tra questi due punti, come posso trovarlo?

cioè

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. 

Grazie

risposta

27

Proprio

length = end - start; 

senza segni & e calchi. L'aritmetica del puntatore C consente questa operazione.

+1

Ho appena provato e ha funzionato, non so perché ho iniziato a lanciare e dentro. Grazie – James

+7

Perché è quello che fai quando sei nuovo a C. Aggiungi solo una stella o una e commerciale e spero che funzioni questa volta. :-) Aspetta, lo capirai. – Thomas

+0

Non l'ho mai fatto. Ma immagino che fosse perché avevo una precedente esperienza con peek() e poke(). – Artelius

8

E 'solo il puntatore dopo meno il puntatore in precedenza.

int length = end - start; 

di verifica e di codice di seguito:

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

Non è necessario eseguire il cast su int - è molto pericoloso, perché int è firmato quindi finirai per fare matematica con due firme firmate invece di puntatori e il risultato potrebbe essere diverso da quello ti aspetti. – qrdl

+0

Non penso che qrdl abbia ragione. Due intietti firmati? In quali due parti sono state firmate? Il cast viene creato per il risultato della sottrazione, non per i due puntatori che vengono sottratti. Il risultato della sottrazione del puntatore è firmato, abbastanza correttamente. Se la fine arriva prima dell'inizio, il risultato dovrebbe essere negativo, giusto? –

0

Questa istruzione C calcola la differenza tra fine e inizio. Semplicemente:

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

C'è persino un tipo, ptrdiff_t, che esiste per contenere una tale lunghezza. È fornito da "stddef.h"

Problemi correlati