uso usar una strings sirve recorrer qué que principales para operaciones longitud librería librerias libreria lenguaje leer funciones extraer estandar ejemplos dev descargar con clases caracteres cadenas cadena bibliotecas biblioteca arreglo c string search io

usar - Buena biblioteca de cadenas en C



usar string en c++ (6)

Recientemente me inspiré para poner en marcha un proyecto que he estado codificando por un tiempo. Quiero hacerlo en C, porque el manejo de la memoria es la clave de esta aplicación. Estaba buscando una buena implementación de cadenas en C, ya que sé que hacerlo yo mismo podría ocasionar algunos desbordamientos de búfer desordenados, y espero lidiar con una cantidad bastante grande de cadenas.

Encontré this artículo que brinda detalles sobre cada uno, pero cada uno parece tener una buena cantidad de inconvenientes (no me malinterpreten, este artículo es EXTREMADAMENTE útil, pero aún me preocupa que, incluso si tuviera que hacerlo). elija uno de esos, no usaría lo mejor que pueda). Tampoco sé cómo está actualizado el artículo, de ahí mi motivo actual.

Lo que estoy buscando es algo que puede contener una gran cantidad de caracteres y simplifica el proceso de búsqueda a través de la cadena. Si me permite tokenizar la cadena de alguna manera, incluso mejor. Además, debería tener un muy buen rendimiento de E / S. La impresión y la impresión formateada no son una prioridad absoluta. Sé que no debería esperar que una biblioteca hiciera todo el trabajo por mí, sino que simplemente vagabundeaba si había una función de secuencia bien documentada que pudiera ahorrarme algo de tiempo y algo de trabajo.

Cualquier ayuda es muy apreciada. ¡Gracias por adelantado!

EDIT: me preguntaron sobre la licencia que prefiero. Cualquier tipo de licencia de fuente abierta servirá, pero preferiblemente GPL (v2 o v3).

EDIt2: encontré la biblioteca betterString (bstring) y se ve bastante bien. Buena documentación, cantidad pequeña pero versátil de funciones y fácil de mezclar con cadenas C. ¿Alguien tiene buenas o malas historias al respecto? El único inconveniente que he leído al respecto es que carece de Unicode (de nuevo, lee sobre esto, aún no lo has visto cara a cara), pero todo lo demás parece bastante bueno.

EDIT3: También, preferible que su C. puro


Me enfrenté recientemente a este problema, la necesidad de anexar una cadena con millones de caracteres. Terminé haciendo lo mío.

Es simplemente una matriz en C de caracteres, encapsulada en una clase que realiza un seguimiento del tamaño de la matriz y la cantidad de bytes asignados.

El rendimiento comparado con SDS y std :: string es 10 veces más rápido con el índice de referencia a continuación

a

https://github.com/pedro-vicente/table-string

Puntos de referencia

Para Visual Studio 2015, compilación de depuración x86:

| API | Seconds | ----------------------|----| | SDS | 19 | | std::string | 11 | | std::string (reserve) | 9 | | table_str_t | 1 | clock_gettime_t timer; const size_t nbr = 1000 * 1000 * 10; const char* s = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; size_t len = strlen(s); timer.start(); table_str_t table(nbr *len); for (size_t idx = 0; idx < nbr; ++idx) { table.add(s, len); } timer.now("end table"); timer.stop();

EDITAR El rendimiento máximo se logra asignando la cadena al inicio (tamaño del parámetro del constructor). Si se utiliza una fracción del tamaño total, el rendimiento disminuye. Ejemplo con 100 asignaciones:

std::string benchmark append string of size 33, 10000000 times end str: 11.0 seconds 11.0 total std::string reserve benchmark append string of size 33, 10000000 times end str reserve: 10.0 seconds 10.0 total table string benchmark with pre-allocation of 330000000 elements end table: 1.0 seconds 1.0 total table string benchmark with pre-allocation of ONLY 3300000 elements, allocation is MADE 100 times...patience... end table: 9.0 seconds 9.0 total


Por favor revisa las milkstrings .
Código de muestra :

int main(int argc, char * argv[]) { tXt s = "123,456,789" ; s = txtReplace(s,"123","321") ; // replace 123 by 321 int num = atoi(txtEat(&s,'','')) ; // pick the first number printf("num = %d s = %s /n",num,s) ; s = txtPrintf("%s,%d",s,num) ; // printf in new string printf("num = %d s = %s /n",num,s) ; s = txtConcat(s,"<-->",txtFlip(s),NULL) ; // concatenate some strings num = txtPos(s,"987") ; // find position of substring printf("num = %d s = %s /n",num,s) ; if (txtAnyError()) { //check for errors printf("%s/n",txtLastError()) ; return 1 ; } return 0 ; }


Si realmente quieres hacerlo bien desde el principio, debes mirar a ICU , es decir, soporte Unicode, a menos que estés seguro de que tus cadenas nunca tendrán nada más que ASCII-7 simple ... Buscar, expresiones regulares, tokenización está todo allí .

Por supuesto, ir a C ++ haría las cosas mucho más fáciles, pero aun así mi recomendación de ICU se mantendría.


Sugeriría no usar ninguna biblioteca aparte de malloc , free , strlen , memcpy y snprintf . Estas funciones le brindan todas las herramientas para un procesamiento de cadenas poderoso, seguro y eficiente en C. Solo manténgase alejado de strcpy , strcat , strncpy y strncat , que tienden a generar ineficiencia y errores explotables.

Como mencionó la búsqueda, cualquiera que sea la elección de biblioteca que haga, strchr y strstr seguramente serán lo que quiera usar. strspn y strcspn también pueden ser útiles.


También encontré la necesidad de una biblioteca de cadenas C externa, ya que las funciones <string.h> parecen muy poco eficientes, por ejemplo:

  • strcat() puede ser muy caro en rendimiento, ya que tiene que encontrar el carácter ''/ 0'' cada vez que concatena una cadena
  • strlen() es costoso, ya que, de nuevo, tiene que encontrar el carácter ''/ 0'' en lugar de solo leer una variable de length mantenida
  • Por supuesto, la matriz de caracteres no es dinámica y puede causar errores muy peligrosos (una falla en la falla de segmentación puede ser el buen escenario cuando se desborda el búfer)

La solución debe ser una biblioteca que no contenga solo funciones, sino que también contenga una estructura que envuelva la cadena y que permita almacenar campos importantes, como la length y buffer-size

Busqué esas bibliotecas en la web y encontré lo siguiente:

  1. La biblioteca GLib String (debería ser la mejor solución estándar) - https://developer.gnome.org/glib/stable/glib-Strings.html
  2. http://locklessinc.com/articles/dynamic_cstrings/
  3. http://bstring.sourceforge.net/

Disfrutar


es una vieja pregunta, espero que ya hayas encontrado una útil. En caso de que no lo haga, consulte la biblioteca Simple Dynamic String en github . Copio y pego la descripción del autor aquí:

SDS es una biblioteca de cadenas para C diseñada para aumentar las funcionalidades de manejo de cadenas libc limitadas al agregar cadenas asignadas de almacenamiento dinámico que son:

  • Más simple de usar.
  • Binario seguro.
  • Computacionalmente más eficiente.
  • Pero aún ... Compatible con las funciones de cuerda C normales.

Esto se logra utilizando un diseño alternativo en el que, en lugar de utilizar una estructura C para representar una cadena, usamos un prefijo binario que se almacena antes del puntero real a la cadena que SDS devuelve al usuario.

+--------+-------------------------------+-----------+ | Header | Binary safe C alike string... | Null term | +--------+-------------------------------+-----------+ | `-> Pointer returned to the user.

Debido a los metadatos almacenados antes del puntero real devuelto como un prefijo, y debido a que cada cadena SDS agrega implícitamente un término nulo al final de la cadena independientemente del contenido real de la cadena, las cadenas SDS funcionan bien junto con las cadenas C y el el usuario es libre de usarlos indistintamente con funciones solo reales que acceden a la cadena en solo lectura.