En la biblioteca estándar C, el strlen es una función de la secuencia que determina la longitud de una serie de caracteres.

Uso del ejemplo

  1. incluir el
  2. de
cañería de la internacional (vacío) { socarrar *string = " Hola World" ; printf (" %d \ n", strlen (la secuencia)); vuelta 0; } Este programa imprimirá el valor 11, que es la longitud del " de la secuencia; Hola World". Los conjuntos de caracteres se almacenan en un arsenal de un tipo de datos llamado char. El extremo de una secuencia es encontrado buscando para el carácter nulo del primer en el arsenal.

Puesta en práctica

Hay muchas puestas en práctica posibles del strlen . Las funciones ingenuas son generalmente rápidas; pero otros métodos existen. La función se suministra generalmente de una biblioteca . Dos cosas valen el tener presente sin embargo:
Los buenos recopiladores del

optimizarán a menudo llamadas para strlen () con las discusiones de las secuencias del constante, haciendo el cálculo en de tiempo de compilación.

que ninguna optimización puede hacer para strlen () rápido para las entradas perceptiblemente grandes, tan almacenando la longitud del " " de las C-secuencias ; está generalmente el arreglo recomendado.

Ingenuo

Una puesta en práctica posible del strlen pudo ser: lang=c> del secuencia inválida de/* * }

para (s=str; *s; s++); s-str de vuelta; } La puesta en práctica antedicha lee la secuencia de comenzar a terminar para buscar para un carácter de NUL. Para cuando ve un carácter de NUL, y la diferencia entre los indicadores de la localización del carácter de NUL y el principio de la secuencia se vuelve.

Acercamiento del Multi-Octeto

Este acercamiento utiliza el truco de comprobar más octetos inmediatamente. El acercamiento anterior utiliza apenas una comprobación del octeto. La nota, ese este acercamiento se explica en valores sin firmar. Observar que este acercamiento comprueba grupos de octetos leyéndolos en una variable. Está hasta el programador para manejar la alineación de la memoria y la disponibilidad apropiadas del tamaño de esa variable. Con todo usted puede leer posiblemente en la dirección de memoria inválida en el último leído. Esto no es tan seguro sin solucionar esas cosas (las secuencias asignadas que alinean en la búsqueda de la ventana, que es hecha ya por el malloc, y de la longitud que es se multiplican de ella).

Si hay una fuerza de octeto cero ser comprobado entendiendo cómo los números se representan en binario. Cada carácter está prendido, deja para presumir 8 pedacitos, octeto. Cierto número de octetos, deja para presumir 4, forma una palabra. Y esa palabra será el grupo que estamos comprobando para saber si hay 0 ' octetos del th.

¿Qué características este octeto tiene? Todos los pedacitos fijaron a 0. Otros tienen algunos de pedacitos fijados a 1. Éste es apenas que ningún número mayor de 0 no es octeto del nul. ¿Qué queremos alcanzar? Ver si hay de octeto cero, y si no hay ninguno debemos tener misma respuesta para todas las variaciones posibles de otros octetos del non-nul. Éste es apenas que queremos una cierta manera de trazar ésos al mismo patrón o el número, que eventualmente el octeto es 0 estará roto.

Si pudiéramos trazar todos los octetos non-0 a un valor y 0 octetos al otro valor sería solucionado.

lang=c> del Este código produce el >= 128 (0x80) del valor para los valores del intervalo <1, 127> trazándolo a <1+127, 127+127>.

Y (y) la operación se utiliza para excluir el pedacito del valor 128, porque causa desbordamiento numérico. Y este valor por lo tanto no se maneja hasta ahora. Pero puesto que excluimos este valor necesitamos hacer algo sobre él. Lo agregamos simplemente, porque es apenas otro valor que tiene que distinguido a partir de 0 valores. Y por lo tanto tiene que ser tratado la misma manera.

lang=c> del pedacito de 128 valores value2 = value1 | valor; // o apenas agrega todos los pedacitos, incluyendo pedacito de 128 valores

Ahora hemos hecho todos los valores que son > 0 valores de pedacito determinados 128.

lang=c> del verdad o falso Esta manera comprobamos si el valor era el >= 0. La solución de Multibyte debe ser obvia.

  1. incluir
el size_t strlen (el *ptr del carbón de leña) { IP de uint32_t*; char* s;

NOTA de //: que este cheque es rarley hecho en bibliotecas de C. si (PTR NULA del ==) ERROR_VALUE de vuelta; //or 0

Alineación de la manija de // aquí si no manejada de alguna manera dentro de secuencia. La secuencia de // tiene que ser alineada en límite del número entero ¡// o algunas arquitecturas pudo comportarse inesperado! NOTA de //: Esto también se requiere de modo que usted no desborde límites de // de la memoria mirando octetos más allá del final de // la C-secuencia. IP = (uint32_t *) PTR;

// multi-salta (menos tiempos alrededor del lazo) mientras que (1) {comprobación para de/* el cero * uint32_t x = *ip; comprobación para de/* no-todo cero * si (((((x y 0x7f7f7f7f) + 0x7f7f7f7f7f) | ¡x) y 0x80808080)! = 0x80808080) rotura; ++ip; /* mueve adelante 4 octetos inmediatamente * }

cuenta de // cuaesquiera octetos restantes para (s = (char*) IP; ¡0! = *s; ++s) /* no hacen nada *;

s de vuelta - PTR; }

Esto se puede encontrar en Hackmem.

Asamblea

Los archivos de jefe para una biblioteca de C particular emiten a veces versiones en línea rápidas del strlen escrito en el montaje . El recopilador puede también hacer esto; o los archivos de jefe pueden llamar simplemente versiones del built-in del recopilador.

El strlen de la escritura en asamblea se hace sobre todo para la velocidad. La complejidad del código emitida de un recopilador es a menudo más alta que la asamblea mano-optimizada, incluso para las funciones muy cortas. Además, una llamada de función requiere la determinación de un marco apropiado de la llamada en la mayoría de las puestas en práctica; estas operaciones pueden compensar el tamaño de funciones simples como el strlen .

  • Zenithic
  • Eredivisie
    Random links:INTERCAL | 1955 | Paul Ehrenberg | Dechado atlántico

  • © 2007-2008 enciclopediaespana.com; article text available under the terms of GFDL, from en.wikipedia.org
    ="http://pagead2.googlesyndication.com/pagead/show_ads.js">