C言語string.hライブラリ関数の詳細解説

  1. 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;
}
  1. 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);
}
  1. char *duplicate_string(char *target, const char *origin)

originの内容をtargetにコピーします。

戻り値:targetの先頭アドレスを返します。

注意事項:

  1. 元文字列は'\0'で終端している必要があります
  2. '\0'もコピー先に転送されます
  3. コピー先の領域は十分な大きさが必要です
  4. コピー先は変更可能である必要があります

実装例:

char* copy_string(char* dest, const char* src)
{
    char* original_dest = dest;
    while ((*dest++ = *src++) != '\0')
        ;
    return original_dest;
}
  1. char *join_strings(char *base, const char *append)

appendをbaseの末尾に連結します。

戻り値:連結後のbaseの先頭アドレスを返します。

注意事項:

  1. 元文字列は'\0'で終端している必要があります
  2. 基底文字列にも'\0'が必要です
  3. 連結後のサイズに対応できる領域が必要です
  4. 基底文字列は変更可能である必要があります

実装例:

char* concatenate(char* dest, const char* src)
{
    char* result = dest;
    while (*dest)
        dest++;
    while ((*dest++ = *src++) != '\0')
        ;
    return result;
}
  1. 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;
}
  1. 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;
}
  1. char *partial_concat(char *dest, const char *src, size_t limit)

srcから最大limit文字をdestの末尾に連結します。

戻り値:連結後のdestの先頭アドレスを返します。

  1. int partial_compare(const char *a, const char *b, size_t count)

文字列aとbの最初のcount文字を比較します。

戻り値:文字列aが大きい場合は正の値、等しい場合は0、小さい場合は負の値を返します。

  1. 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);
    }
}
  1. char *error_description(int error_code)

エラーコードに対応するエラーメッセージ文字列を返します。

戻り値:エラーメッセージの文字列アドレスを返します。

  1. 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;
}
  1. 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;
}
  1. 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"
}
  1. 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");
}

タグ: C言語 string.h メモリ操作 文字列処理 ライブラリ関数

9月6日 06:41 投稿