str -- 문자열
str 모듈은 길이, 비교, 복사, 검색, 토큰화, 복제를 아우르는 C 문자열
조작 함수를 제공합니다. 이 함수들은 NUL로 끝나는 C 문자열을 첫 문자에 대한
참조로 받습니다 — 읽을 때는 const &char, 쓸 때는 &char. 문자열
리터럴과 char 배열은 그대로 넘길 수 있습니다.
가변적이고 힙에 할당되는, 커질 수 있는 문자열 타입은
String 컬렉션을
참고합니다.
#include <std/str.h>
길이 및 비교
str_len
unsigned long str_len(const &char s);
s의 바이트 길이를 반환합니다(NUL 종료 문자는 포함하지 않음).
str_cmp
int str_cmp(const &char a, const &char b);
사전식 비교. < 0, 0, > 0 중 하나를 반환합니다.
str_ncmp
int str_ncmp(const &char a, const &char b, unsigned long n);
a와 b를 최대 n바이트까지 비교합니다.
str_eq
int str_eq(const &char a, const &char b);
두 문자열이 같으면 1, 아니면 0을 반환합니다. str_cmp를 감싸는 편의
래퍼입니다.
복사 및 연결
str_copy
int str_copy([]char dst, const &char src);
src를 dst로 복사합니다 -- NUL을 포함해 최대 n바이트까지. dst는
최소 n바이트를 담을 수 있어야 합니다.
str_cat
int str_cat([]char dst, const &char src);
dst에 있는 NUL로 끝나는 문자열 뒤에 src를 덧붙입니다. 대상 버퍼는
충분한 공간을 가지고 있어야 합니다.
str_ncat
int str_ncat([]char dst, const &char src, unsigned long n);
src의 최대 n바이트를 dst에 덧붙이고 항상 NUL로 종료합니다.
검색
str_find
const ?&char str_find(const &char haystack, const &char needle);
haystack에서 needle이 처음 나타나는 위치를 찾습니다. 일치하는
위치에 대한 포인터를 반환하며, 찾지 못하면 NULL을 반환합니다.
str_find_char
const ?&char str_find_char(const &char s, int c);
s에서 문자 c가 처음 나타나는 위치를 찾습니다. 포인터 또는 NULL을
반환합니다.
str_rfind_char
const ?&char str_rfind_char(const &char s, int c);
s에서 문자 c가 마지막으로 나타나는 위치를 찾습니다. 포인터 또는
NULL을 반환합니다.
str_find_any
const ?&char str_find_any(const &char s, const &char accept);
s에서 accept에도 속하는 첫 번째 문자를 찾습니다. 포인터 또는 NULL을
반환합니다.
구간 및 분류
str_span
unsigned long str_span(const &char s, const &char accept);
s의 시작 부분 중 accept에 속한 문자로만 이루어진 구간의 길이를
반환합니다.
str_cspan
unsigned long str_cspan(const &char s, const &char reject);
s의 시작 부분 중 reject에 속한 문자가 하나도 없는 구간의 길이를
반환합니다.
토큰화
str_tok
?&char str_tok(?&char s, const &char delim, &?&char saveptr);
재진입 가능한 토크나이저(strtok_r/strtok_s를 감쌈).
- 첫 호출:
s에 문자열을 전달하고,saveptr에는?&char변수의 주소를 전달합니다(토크나이저가 위치를 기억하는 곳). - 이후 호출:
s에null을 전달합니다. - 다음 토큰에 대한 참조를 반환하거나, 모두 소진되면
null을 반환합니다. - 입력 문자열은 실제로 수정됩니다(구분자 위치에 NUL 종료 문자가 기록됨).
메모리 검색
mem_chr
const ?&unsigned char mem_chr([]const unsigned char s, int c);
s가 가리키는 n바이트 블록 안에서 바이트 c가 처음 나타나는
위치에 대한 포인터를 반환하며, 없으면 NULL을 반환합니다.
할당 및 복제
str_dup
?&heap char str_dup(const &char s);
s의 힙에 할당된 NUL로 끝나는 복사본을 반환합니다. 호출자는 이를
해제하기 위해 dealloc()을 호출해야 합니다.
str_ndup
?&heap char str_ndup(const &char s, unsigned long n);
s의 처음 최대 n바이트를 힙에 복사하고 NUL로 종료하여 반환합니다.
s가 그보다 먼저 끝나면 더 적게 복사합니다(종료 문자 너머는 읽지 않습니다).
예제
#include <std/str.h>
#include <std/io.h>
#include <std/mem.h>
int main() {
const &char greeting = "Hello, SafeC!";
// Length
unsigned long len = str_len(greeting);
print("Length: ");
println_int(len); // 13
// Search
match (str_find(greeting, "SafeC")) {
case some(pos): { println(pos); } // SafeC!
case null: { println("not found"); }
}
// Duplication
?&heap char copy = str_dup(greeting);
match (copy) {
case some(c): { println(c); }
case null: { }
}
dealloc(copy);
// Tokenisation
char buf[64];
str_copy(buf[..], "one,two,three");
?&char save = null;
?&char tok = str_tok(buf, ",", &save);
while (!tok.is_null()) {
match (tok) { case some(t): { println(t); } case null: { } }
tok = str_tok(null, ",", &save);
}
return 0;
}
플레이그라운드에서 실행