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
文字列の終わり。