- char *find_char(const char *sequence, int symbol)
文字列sequence内に文字symbolが存在するかを探索します。
戻り値:発見した場合、その文字のアドレスを返します。発見できない場合はNULLポインタを返します。
実装例:
char* locate_character(const char* text, int target)
{
while (*text != '\0')
{
if (*text == target)
{
return (char*)text;
}
text++;
}
return NULL;
}
- size_t compute_length(const char *input)
文字列の長さを計算します。
戻り値:文字列の要素数を返します。
実装例:
size_t calculate_len(const char* str)
{
const char* start = str;
while (*str)
{
str++;
}
return str - start;
}
size_t recursive_len(const char* str)
{
return (*str == '\0') ? 0 : 1 + recursive_len(str + 1);
}
- char *duplicate_string(char *target, const char *origin)
originの内容をtargetにコピーします。
戻り値:targetの先頭アドレスを返します。
注意事項:
- 元文字列は'\0'で終端している必要があります
- '\0'もコピー先に転送されます
- コピー先の領域は十分な大きさが必要です
- コピー先は変更可能である必要があります
実装例:
char* copy_string(char* dest, const char* src)
{
char* original_dest = dest;
while ((*dest++ = *src++) != '\0')
;
return original_dest;
}
- char *join_strings(char *base, const char *append)
appendをbaseの末尾に連結します。
戻り値:連結後のbaseの先頭アドレスを返します。
注意事項:
- 元文字列は'\0'で終端している必要があります
- 基底文字列にも'\0'が必要です
- 連結後のサイズに対応できる領域が必要です
- 基底文字列は変更可能である必要があります
実装例:
char* concatenate(char* dest, const char* src)
{
char* result = dest;
while (*dest)
dest++;
while ((*dest++ = *src++) != '\0')
;
return result;
}
- int compare_strings(const char *first, const char *second)
二つの文字列を辞書順で比較します。
戻り値:最初の文字列が大きい場合は正の値、等しい場合は0、小さい場合は負の値を返します。
実装例:
int lexical_compare(const char* a, const char* b)
{
while (*a && (*a == *b))
{
a++;
b++;
}
return *(unsigned char*)a - *(unsigned char*)b;
}
- char *partial_copy(char *dest, const char *src, size_t limit)
srcから最大limit文字をdestにコピーします。srcの長さがlimitより短い場合は、残りを'\0'で埋めます。
戻り値:destの先頭アドレスを返します。
実装例:
char* limited_copy(char* dest, const char* src, size_t n)
{
size_t i;
for (i = 0; i < n && src[i] != '\0'; i++)
{
dest[i] = src[i];
}
for ( ; i < n; i++)
{
dest[i] = '\0';
}
return dest;
}
- char *partial_concat(char *dest, const char *src, size_t limit)
srcから最大limit文字をdestの末尾に連結します。
戻り値:連結後のdestの先頭アドレスを返します。
- int partial_compare(const char *a, const char *b, size_t count)
文字列aとbの最初のcount文字を比較します。
戻り値:文字列aが大きい場合は正の値、等しい場合は0、小さい場合は負の値を返します。
- char *split_string(char *target, const char *delimiters)
delimitersで指定された区切り文字を使用して文字列を分割します。
注意事項:この関数は操作対象の文字列を変更するため、通常は一時的なコピーに対して使用します。
戻り値:次のトークンのポインタを返します。トークンがない場合はNULLを返します。
使用例:
void example_usage()
{
char address[] = "192.168.1.100";
const char* separator = ".";
char* token;
for (token = split_string(address, separator);
token != NULL;
token = split_string(NULL, separator))
{
printf("%s\n", token);
}
}
- char *error_description(int error_code)
エラーコードに対応するエラーメッセージ文字列を返します。
戻り値:エラーメッセージの文字列アドレスを返します。
- void *memory_copy(void *destination, const void *source, size_t bytes)
sourceからbytesバイトをdestinationにコピーします。メモリ領域が重複している場合の動作は未定義です。
実装例:
void* memory_copy(void* dest, const void* src, size_t n)
{
unsigned char* d = dest;
const unsigned char* s = src;
while (n--)
{
*d++ = *s++;
}
return dest;
}
- void *memory_move(void *destination, const void *source, size_t bytes)
sourceからbytesバイトをdestinationに移動します。メモリ領域が重複していても安全に動作します。
実装例:
void* memory_move(void* dest, const void* src, size_t n)
{
unsigned char* d = dest;
const unsigned char* s = src;
if (d <= s || d >= s + n)
{
while (n--)
{
*d++ = *s++;
}
}
else
{
d += n - 1;
s += n - 1;
while (n--)
{
*d-- = *s--;
}
}
return dest;
}
- void *memory_set(void *ptr, int value, size_t num)
ptrが指すメモリ領域の最初のnumバイトをvalueに設定します。
戻り値:ptrのアドレスを返します。
使用例:
void demo_memset()
{
char data[20] = "sample text";
memory_set(data, 'X', 6);
printf("%s\n", data); // "XXXXXX text"
}
- int memory_compare(const void *ptr1, const void *ptr2, size_t num)
ptr1とptr2が指すメモリ領域の最初のnumバイトを比較します。
戻り値:ptr1の領域が大きい場合は正の値、等しい場合は0、小さい場合は負の値を返します。
使用例:
void demo_memcmp()
{
unsigned char block1[] = {0x12, 0x34, 0x56, 0x78};
unsigned char block2[] = {0x12, 0x34, 0x56, 0x79};
int result = memory_compare(block1, block2, sizeof(block1));
if (result > 0)
printf("block1 > block2\n");
else if (result < 0)
printf("block1 < block2\n");
else
printf("block1 == block2\n");
}