C 言語で文字列の一部を取得

胡金庫 2023年10月12日
  1. 関数 strncpy を使って C 言語の文字列の一部を取得する
  2. カスタム関数を使って C 言語で文字列の一部を取得する
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
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C String