Arduino strcpy 関数

Ammar Ali 2023年10月12日
Arduino strcpy 関数

このチュートリアルでは、Arduino の strcpy() 関数を使用して、ある変数から別の変数に 1つの文字列をコピーする方法について説明します。

Arduino strcpy() 関数

strcpy() 関数は、null 文字を含む文字列をある変数から別の変数にコピーできます。strcpy() 関数の基本的な構文を以下に示します。

output = strcpy(dest, source);

strcpy() 関数の最初の入力はデータタイプ char である必要があり、2 番目の入力はデータタイプ constchar である必要があります。この関数は、コピーされた文字列を文字文字列として返します。

デスティネーションサイズがソースサイズを超える場合、strcpy() 関数はデスティネーション文字列内にターミネータとして NUL 文字も追加します。宛先文字列にすでに文字列が保存されている場合、前の文字列は新しい文字列で上書きされます。

たとえば、文字列を定義し、strcpy() 関数を使用して別の変数にコピーしてみましょう。以下のコードを参照してください。

void setup() {
  const char* source = "Hello World";
  char destination[17];
  Serial.begin(9600);
  strcpy(destination, source);
  Serial.println(destination);
}
void loop() {}

出力:

Hello World

上記のコードでは、Arduino のシリアルモニターを使用して、destination 変数内に格納されている文字列を印刷しました。destination 変数の長さは、source 文字列全体を保持するのに十分な大きさである必要があります。

長さが source 文字列より短い場合、結果が変更され、strcpy() 関数の動作は未定義になります。

source 文字列と destination 文字列のサイズが異なるため、strcpy() 関数がオーバーフローし、コードに問題が発生します。Arduino はオーバーフローが原因でエラーを表示せず、問題の特定に時間がかかる場合があります。

たとえば、destination 変数のサイズを 5(上記のコードでは 17)に変更して、結果を確認してみましょう。以下のコードを参照してください。

void setup() {
  const char* source = "Hello World";
  char destination[5];
  Serial.begin(9600);
  strcpy(destination, source);
  Serial.println(destination);
}
void loop() {}

出力:

Èõüÿ

上記の出力からわかるように、destination 変数のサイズが source 変数のサイズよりも小さいため、結果が変更されています。良い結果を得るには、destination 変数のサイズが source 変数のサイズよりも大きいことを確認する必要があります。

strncpy() である strcpy() 関数の長さ制限バージョンを使用できます。strncpy() 関数は、source 文字列を destination 変数にコピーしますが、宛先の長さも入力として受け取ります。

strncpy() 関数は、source 文字列から NUL 文字が検出された場合にのみ、destination 文字列の残りのスペースを埋めるために NUL 文字を書き込みます。source 文字列に NUL 文字がない場合、destination 文字列は NUL 文字で終了しません。

たとえば、strncpy() 関数を使用して上記の例を繰り返しましょう。以下のコードを参照してください。

void setup() {
  const char* source = "Hello World";
  char destination[5];
  Serial.begin(9600);
  strncpy(destination, source, sizeof(destination));
  Serial.println(destination);
}
void loop() {}

出力:

Hello

この例の出力には、source の最初の 5 文字が含まれています。したがって、strncpy() 関数を使用する場合、strncpy()destination のサイズに従って source の文字数をコピーするため、関数のオーバーフローを気にする必要はありません。

この関数は、文字列全体をコピーするのではなく、ソースから宛先に数文字だけをコピーする場合にも役立ちます。strcpy() および strncpy() 関数も、コピーされた char データタイプの文字列を返します。

strlcpy() 関数である strcpy() 関数の別の長さ制限バージョンもあります。strlcpy() 関数は strncpy() 関数と同じですが、違いは、strlcpy() 関数の出力がソース文字列の長さであるということです。

strncpy() 関数とは異なり、strlcpy() 関数は destination 文字列の残りのスペースを埋めるために複数の NUL 文字を書き込みません。また、destination 文字列に 1つの NUL 文字のみを書き込みます。destination 文字列は、strlcpy() 関数を使用して常に単一の NUL 文字で終了します。

destination 文字列内に格納されている文字には、NUL 文字も含まれます。たとえば、destination 文字列のサイズが 5 の場合、NUL 文字のため、コピーできるのは 4 文字のみです。

したがって、5 文字をコピーするには、destination 文字列のサイズを 6 に増やす必要があります。ただし、これは、destination 文字列のサイズが source 文字列のサイズより大きい場合にのみ NUL 文字を追加する strcpy() および strncpy() 関数には当てはまりません。

たとえば、strlcpy() 関数を使用して上記の例を繰り返しましょう。以下のコードを参照してください。

void setup() {
  const char* source = "Hello World";
  char destination[5];
  Serial.begin(9600);
  strlcpy(destination, source, sizeof(destination));
  Serial.println(destination);
}
void loop() {}

出力:

Hell

出力からわかるように、destination のサイズが 5 であっても、source 文字列の 4 文字が destination にコピーされています。これは、strlcpy() 関数がで NUL 文字も追加したためです。destination 文字列の終わり。

著者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

関連記事 - Arduino String