Boa biblioteca de texto C

Recentemente, inspirei-me para iniciar um projecto que queria codificar há algum tempo. Eu quero fazê-lo em C, porque o manuseio de memória é a chave desta aplicação. Eu estava procurando por uma boa implementação de cordas em C, uma vez que eu sei que fazê-lo eu mesmo poderia levar a alguns fluxos de buffer bagunçado, e eu espero estar lidando com uma quantidade razoavelmente grande de cordas.

encontrei este artigo que dá detalhes sobre cada um, mas cada um deles parece ter uma boa quantidade de contras indo para eles (não me leve a mal, este artigo é extremamente útil, mas ainda me preocupa que, mesmo se eu fosse escolher um desses, eu não estaria usando o melhor que posso obter). Também não sei se o artigo está actualizado, daí a minha alegação actual.

o que eu estou procurando é algo que pode conter uma grande quantidade de caracteres, e simplifica o processo de busca através da string. Se me permite toquiar a corda de alguma forma, ainda melhor. Além disso, deveria ter uma boa actuação. Imprimir e formatar a impressão não é uma prioridade. Eu sei que não devia esperar que uma biblioteca fizesse todo o trabalho por mim, mas estava apenas a pensar se havia uma função bem documentada de cordas lá fora que me poderia poupar algum tempo e algum trabalho.

Qualquer ajuda é muito apreciada. Obrigado antecipadamente!

EDIT: perguntaram-me sobre a licença que prefiro. Qualquer tipo de licença de código aberto serve, mas preferencialmente GPL (v2 ou v3).

EDIt2: Encontrei a biblioteca betterString e parece muito boa. Boa documentação, pequena mas versátil quantidade de funções, e fácil de misturar com cordas c. Alguém tem histórias boas ou más sobre isso? A única desvantagem que eu li sobre ele é que lhe falta Unicode (novamente, leia sobre isso, ainda não vi cara a cara), mas tudo o resto parece muito bom.

EDIT3: também é preferível que o seu C.

puro.
Author: chamakits, 2011-01-14

6 answers

É uma pergunta antiga, espero que já tenha encontrado uma útil. No caso de não o fazer, verifique por favor a Biblioteca dinâmica simples em github. I copiar e colar a descrição do autor aqui:

SDS é uma biblioteca de texto para C desenhada para aumentar o texto libc limitado lidar com as funcionalidades, adicionando strings atribuídas heap que são:

  • mais simples de usar.
  • binário seguro.
  • Computacionalmente mais eficiente. Mas ainda... Compatível com funções normais de cadeia de caracteres C.

Isto é conseguido utilizando um desenho alternativo no qual, em vez de usar um C estrutura para representar uma string, usamos um prefixo binário que é armazenado antes do ponteiro real para a string que é devolvido por SDS para o usuário.

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

Devido aos meta-dados armazenados antes do ponteiro devolvido como prefixo, e por causa de cada string SDS implicitamente adicionando um termo nulo no final de cadeia independentemente do conteúdo real da string, as strings SDS funcionam bem, junto com cordas C e o Usuário é livre de usá-las alternadamente com funções reais que acessam a string apenas em leitura.

 22
Author: Steinway Wu, 2014-08-01 18:54:04
Eu sugiro não usar nenhuma biblioteca para além de ... malloc, free, strlen, memcpy, e snprintf Estas funções dão - lhe todas as ferramentas para o processamento de texto poderoso, seguro e eficiente em C. Apenas fique longe de strcpy, strcat, strncpy, e strncat, todos os quais tendem a levar a ineficiência e erros exploráveis.

Já que mencionaste a procura, qualquer que seja a escolha da biblioteca que faças, strchr e strstr são quase de certeza que vão ser o que queres usar. strspn e strcspn também podem sê útil.

 9
Author: R.., 2018-07-13 00:58:25

Se você realmente quiser obtê-lo desde o início, você deve olhar para ICU, ou seja, Suporte Unicode, a menos que você esteja certo as suas cordas nunca irão conter nada além de simples ASCII-7... Procurar, expressões regulares, tokenization está tudo aí.

Claro que ir para C++ tornaria as coisas muito mais fáceis , mas mesmo assim a minha recomendação da UCI manter-se-ia.

 2
Author: DevSolar, 2014-03-04 15:17:27

Por favor verifique as milkstrings.
Código Da Amostra:

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 ;
  }
 2
Author: archimedes, 2016-08-14 07:55:08

Também encontrei a necessidade de uma biblioteca de cordas c externa, pois considero as funções {[[0]} Muito pouco eficientes, por exemplo:

  • strcat() pode ser muito caro no desempenho, pois tem que encontrar o '\0' cada vez que você concatenate uma string
  • strlen() é caro, como de novo, tem de encontrar o' \0 ' char em vez de apenas ler uma variável mantida length
  • O array char não é dinâmico e pode causar erros muito perigosos. pode ser o bom cenário quando você transborda seu buffer)

A solução deve ser uma biblioteca que não contém apenas funções, mas também contém uma estrutura que envolve a cadeia e que permite armazenar campos importantes, tais como length e buffer-size

Procurei essas bibliotecas pela Internet e encontrei o seguinte:
  1. GLib String library (should be best standard solution) - https://developer.gnome.org/glib/stable/glib-Strings.html
  2. http://locklessinc.com/articles/dynamic_cstrings/
  3. http://bstring.sourceforge.net/
Diverte-te.
 1
Author: SomethingSomething, 2016-01-07 14:52:07

Eu enfrentei este problema recentemente, a necessidade de adicionar uma string com milhões de caracteres. Acabei por fazer o meu próprio.

É simplesmente um array C de caracteres, encapsulado em uma classe que mantém o controle do tamanho do array e número de bytes alocados.

O desempenho em comparação com SDS e std:: string é 10 vezes mais rápido com o valor de referência abaixo

Em

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

Marcos de Referência

Para Visualização Studio 2015, x86 debug build:

| 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 O desempenho máximo é alcançado atribuindo a cadeia de caracteres todos no início (Tamanho do parâmetro construtor). Se for utilizada uma fracção do tamanho total, o desempenho diminui. Exemplo com 100 atribuições:

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
 1
Author: Pedro Vicente, 2017-09-08 19:38:23