🐕

【C 言語】ひらがなの部分文字列を表示する

2024/06/14に公開

printf のフォーマッターを %.*s に変えると最初から指定したサイズの文字列を表示させることができる。ひらがなの場合、1文字は3バイトなので、3文字を散りだすには9バイトの指定が必要になる

#include <stdio.h>
#include <stdint.h>

int main(void){
    uint8_t *str = "あいうえお";

    // あいう
    printf("%.*s\n", 9, str);

    // えお
    printf("%s\n", str+9);

    // あいうえお
    printf("%s\n", str);

    str += 9;

    // えお
    printf("%s\n", str);

    str -= 9;

    // あいうえお
    printf("%s\n", str);

    return 0;
}

今度は strndup (POSIX 標準、C23) を使って部分文字列をコピーして表示する方法を示す。コピー先のメモリの容量や末端のヌル文字を考えなくてすむ

#include<stdio.h>
#include <stdint.h>
#include<string.h>

int main()
{
    uint8_t* src = "あいうえお";

    // あいう
    uint8_t* dest = strndup(src, 9);
    printf("%s\n", dest);

   // えお
    dest = strndup(src+9, 6);
    printf("%s\n", dest);

    return 0;
}

strncpy を使う場合、終端のヌル文字は保証されないので自分で投入する必要がある

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

int main()
{
    uint8_t* src = "あいうえお";
    uint8_t* dest;

    // あいう
    dest = malloc(9 + 1);
    strncpy((char*) dest, (char*) src, 9);
    dest[9] = 0;
    printf("%s\n", dest);

    // えお
    strncpy((char*) dest, (char*) src+9, 6);
    dest[6] = 0;
    printf("%s\n", dest);

    // あいうえお
    dest = realloc(dest, 15+1);
    strncpy((char*) dest, (char*) src, 15);
    dest[15] = 0;
    printf("%s\n", dest);

    return 0;
}

Discussion