programing

양호한 C 문자열 라이브러리

javajsp 2023. 8. 12. 09:51

양호한 C 문자열 라이브러리

저는 얼마 전부터 코딩을 하고 싶었던 프로젝트를 시작하려고 영감을 받았습니다.이 애플리케이션은 메모리 처리가 핵심이기 때문에 C에서 하고 싶습니다.저는 C에서 문자열의 좋은 구현을 찾고 있었습니다. 제가 직접 실행하면 지저분한 버퍼 오버플로가 발생할 수 있다는 것을 알고 있었기 때문입니다. 그리고 저는 꽤 많은 양의 문자열을 처리할 것으로 예상합니다.

저는 각각에 대한 세부 정보를 제공하는 이 기사를 찾았지만, 그들은 각각 상당한 양의 단점을 가지고 있는 것처럼 보입니다(오해하지 마십시오, 이 기사는 매우 도움이 되지만, 제가 그 중 하나를 선택하더라도 제가 얻을 수 있는 최선을 사용하지 않을 것이라는 점이 여전히 우려됩니다).저 또한 그 기사가 얼마나 최신인지 모르기 때문에 저의 현재 탄원서입니다.

제가 찾고 있는 것은 많은 양의 문자를 포함할 수 있고 문자열을 검색하는 과정을 단순화하는 것입니다.만약 제가 어떤 식으로든 문자열을 토큰화할 수 있다면,또한 I/O 성능이 상당히 우수해야 합니다.인쇄 및 포맷된 인쇄는 최우선 순위가 아닙니다.저는 도서관이 저를 위해 모든 일을 해줄 것이라고 기대해서는 안 된다는 것을 압니다. 하지만 저를 위해 시간과 일을 절약할 수 있는 잘 문서화된 문자열 기능이 있다면 그저 방황하고 있었을 뿐입니다.

어떤 도움이든 대단히 감사합니다.잘 부탁드립니다!

편집: 선호하는 라이센스에 대한 질문을 받았습니다.모든 종류의 오픈 소스 라이센스가 가능하지만, 가급적이면 GPL(v2 또는 v3)이 좋습니다.

EDit2: 더 나은 String(bstring) 라이브러리를 찾았는데 꽤 좋아 보입니다.좋은 문서, 작지만 다재다능한 기능, c 문자열과 함께 사용하기 쉽습니다.그것에 대해 좋은 이야기나 나쁜 이야기가 있는 사람?내가 그것에 대해 읽은 유일한 단점은 유니코드가 없다는 것이다(다시 말하지만, 이것에 대해 읽고, 아직 그것을 직접 본 적이 없다). 하지만 다른 모든 것은 꽤 좋아 보입니다.

EDIT3: 또한, 순수한 C인 것이 좋습니다.

오래된 질문입니다, 이미 유용한 질문을 찾으셨기를 바랍니다.혹시 모르셨다면, github에서 Simple Dynamic String 라이브러리를 확인해 보세요.저자의 설명을 복사하여 여기에 붙여넣습니다.

SDS는 다음과 같은 힙 할당 문자열을 추가하여 제한된 libc 문자열 처리 기능을 확장하도록 설계된 C용 문자열 라이브러리입니다.

  • 사용이 간편합니다.
  • 바이너리 금고.
  • 계산적으로 더 효율적입니다.
  • 하지만...일반 C 문자열 기능과 호환됩니다.

이는 문자열을 나타내기 위해 C 구조를 사용하는 대신 SDS에서 사용자에게 반환되는 문자열에 대한 실제 포인터 이전에 저장된 이진 접두사를 사용하는 대체 설계를 사용하여 달성됩니다.

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

실제 반환된 포인터 앞에 접두사로 저장된 메타데이터와 문자열의 실제 내용에 관계없이 문자열 끝에 null 용어를 암시적으로 추가하는 모든 SDS 문자열 때문에,SDS 문자열은 C 문자열과 함께 사용할 수 있으며 사용자는 읽기 전용으로 문자열에 액세스하는 실제 전용 기능과 자유롭게 호환하여 사용할 수 있습니다.

이외에 어떤 도서관도 사용하지 않는 것이 좋습니다.malloc,free,strlen,memcpy,그리고.snprintf이러한 기능은 C에서 강력하고 안전하며 효율적인 문자열 처리를 위한 모든 도구를 제공합니다.가까이 가지 마strcpy,strcat,strncpy,그리고.strncat이 모든 것이 비효율적이고 악용 가능한 버그로 이어지는 경향이 있습니다.

하셨으니까 어떤 하시든지 간에, 이검색언이후로급한선, 당이어도택든하을관서떤당을신신▁you선▁since.strchr그리고.strstr당신이 사용하고자 하는 것이 거의 확실하게 될 것입니다.strspn그리고.strcspn또한 유용할 수 있습니다.

처음부터 제대로 맞추려면 ICU, 즉 ICU를 살펴봐야 합니다.유니코드를 지원합니다. 문자열에 일반 ASCII-7 이외의 항목이 포함되지 않는 한...검색, 정규식, 토큰화 등이 모두 포함되어 있습니다.

물론 C++을 사용하는 것이 훨씬 더 쉽게 일을 할 수 있지만, ICU에 대한 저의 추천은 그럴 것입니다.

우유 줄을 확인하십시오.
코드 플코드샘:

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 ;
  }

는 또한 외부 C 문자열 에 외부 C 라이브러리의 필요성을 했습니다.<string.h>기능이 매우 비효율적입니다. 예:

  • strcat() 수 .
  • strlen()비용이 많이 듭니다. 마찬가지로 유지되는 문자를 읽는 대신 '\0' 문자를 찾아야 합니다.length변수
  • 문자 배열은 물론 동적이지 않으며 매우 위험한 버그를 발생시킬 수 있습니다(분할 오류의 충돌은 버퍼를 오버플로할 때 좋은 시나리오가 될 수 있습니다)

솔루션은 함수만 포함하는 것이 아니라 문자열을 싸고 다음과 같은 중요한 필드를 저장할 수 있는 구조를 포함하는 라이브러리여야 합니다.length그리고.buffer-size

웹에서 이러한 라이브러리를 찾아보니 다음과 같습니다.

  1. GLib String 라이브러리(최고의 표준 솔루션이어야 함) - https://developer.gnome.org/glib/stable/glib-Strings.html
  2. http://locklessinc.com/articles/dynamic_cstrings/
  3. http://bstring.sourceforge.net/

즐거운 시간 되세요.

저는 최근에 수백만 개의 문자가 있는 문자열을 추가해야 하는 이 문제에 직면했습니다.저는 결국 제 일을 하게 되었습니다.

이것은 단순히 배열 크기와 할당된 바이트 수를 추적하는 클래스에 캡슐화된 문자의 C 배열입니다.

SDS 및 std::string과 비교한 성능은 아래 벤치마크에서 10배 더 빠릅니다.

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

벤치마크

Visual Studio 2015의 경우 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();

EDIT 시작 시 문자열을 모두 할당하면 최대 성능을 얻을 수 있습니다(생성자 매개 변수 크기).전체 크기의 일부를 사용하면 성능이 저하됩니다.100개의 할당이 있는 예:

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

언급URL : https://stackoverflow.com/questions/4688041/good-c-string-library