C 言語で文字列の一部を取得
この記事では、C 言語で文字列の一部を取得する方法について複数の方法を紹介します。
関数 strncpy
を使って C 言語の文字列の一部を取得する
strncpy
は、<string.h>
ヘッダファイルで定義されている C 言語の文字列ライブラリ関数の一部です。この関数は元の文字列から指定されたバイト数のバイトをコピー先にコピーします。strncpy
は、コピー先の char*
、コピー元のポインタ、コピーするバイト数を表す整数の 3つのパラメータを取ります。指定されたバイト数がソース文字列に含まれるバイト数を超える場合は、追加のヌルバイトが宛先に格納されます。
関数 strncpy
はコピー先の文字列へのポインタを返すので、この呼び出しを printf
文に連鎖させて直接文字列の一部を出力することができます。以下の例は、最初の 4 文字の文字列の一部を表示し、次に 10 文字の文字列の一部を表示する方法を示しています。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char *tmp = "This string literal is arbitrary";
int main(int argc, char *argv[]) {
char *str = malloc(strlen(tmp));
printf("%s\n", strncpy(str, tmp, 4));
printf("%s\n", strncpy(str, tmp + 5, 10));
free(str) exit(EXIT_SUCCESS);
}
出力:
This
string lit
カスタム関数を使って C 言語で文字列の一部を取得する
あるいは、strncpy
のカスタム関数ラッパーを定義し、4つのパラメータからなる新しいインターフェースを指定することもできます。すなわち、関数 getSubstring
は、送信先と送信元の文字列に、文字列の一部として必要な文字の開始位置と終了位置を指定する 2つの整数を加えたものを受け取ります。この関数のプロトタイプは追加のエラーチェックを実装していませんが、strncpy
の呼び出しで渡された char*
ポインタを直接返します。
前の例と同様に、getSubstring
は引数として printf
関数に連結することもできます。strncpy
に関する一つの注意点は、宛先文字列とソース文字列がメモリ上で重なってはならないということです。また、宛先ポインタはソース文字列を格納するのに十分な大きさのバッファを指すべきです。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char *tmp = "This string literal is arbitrary";
char *getSubstring(char *dst, const char *src, size_t start, size_t end) {
return strncpy(dst, src + start, end);
}
int main(int argc, char *argv[]) {
char *str = malloc(strlen(tmp));
printf("%s\n", getSubstring(str, tmp, 0, 4));
printf("%s\n", getSubstring(str, tmp, 5, 10));
free(str);
exit(EXIT_SUCCESS);
}
出力:
This
string lit