2009-07-06 25 views
9

me encontré con un pequeño problema y necesitan un poco de ayuda:longitud de cadena entre los punteros

Si tengo un búfer asignado de caracteres y tengo un comienzo y final los puntos que están en algún lugar dentro de este tampón y quiero la longitud entre estos dos puntos, ¿cómo puedo encontrarlo?

es decir

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. 

Gracias

Respuesta

27

Sólo

length = end - start; 

sin símbolos de unión y yesos. La aritmética del puntero C permite esta operación.

+1

Lo intenté y funcionó, no sé por qué comencé a tirar y allí. Gracias – James

+7

Porque eso es lo que haces cuando eres nuevo en C. Solo agrega una estrella o un símbolo y espero que funcione esta vez. :-) Aguanta, lo conseguirás. – Thomas

+0

Nunca hice eso. Pero creo que fue porque tenía experiencia previa con peek() y poke(). – Artelius

8

Es sólo el puntero después menos el puntero anterior.

int length = end - start; 

Verificación y código de ejemplo a continuación:

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

No necesita convertir a int - es muy peligroso, porque int está firmado por lo que terminará haciendo matemática con dos entradas firmadas en lugar de punteros y el resultado puede diferir de lo que tu esperas. – qrdl

+0

No creo que qrdl tenga razón. ¿Dos entradas firmadas? ¿Qué dos entradas firmadas? El elenco se está realizando para el resultado de la resta, no para los dos indicadores que se restan. El resultado de la resta del puntero está firmado, bastante correctamente. Si el final realmente llega antes del inicio, entonces el resultado debería ser negativo, ¿no? –

0

Esta declaración C calculará la diferencia entre el final y el inicio. Simplemente:

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

Incluso hay un tipo, ptrdiff_t, que existe para mantener tal longitud. Es provisto por 'stddef.h'

Cuestiones relacionadas