strcpy
は、2番目の文字列の内容を最初の文字列のメモリにコピーします。文字列リテラルを文字列リテラルにコピーするので、それを行うことはできません(文字列リテラルに書き込むことはできません)ので、不平を言います。
代わりに、独自の検索と置換システムを構築する必要があります。 strstr()
を使用すると、文字列内の部分文字列を検索できます。見つかった場合は、その文字列の先頭にポインタを返します。
サンプルストリングJack and Jill went up the hill
を考えてみましょう。それ0x104
だろう(0x100 + 4
)内の文字列(スペースを含む)(例えば0x100
)を加えた単語のオフセット「と」の先頭のアドレスを返します
char *andloc = strstr(buffer, " and ");
。
見つかった場合は、&
シンボルに置き換えることができます。しかし、それは文字列を終了するので、strcpy
を使用することはできません。代わりに、手動でバイトを設定するか、memcpyを使用することができます。
if (andloc != NULL) { // it's been found
andloc[1] = '&';
andloc[2] = ' ';
}
か:
if (andloc != NULL) { // it's been found
memcpy(andloc, " & ", 3);
}
Jack & d Jill went up the hill
ことになります。私たちはまだそこにいません。次に、古い "and"から "d"をカバーするために、すべてをシャッフルする必要があります。そのためには、strcpy
またはmemcpy
を使用できると思っていましたが、文字列(送信元と送信先)が重複し、両方のマニュアルページに文字列が重複してはならないと書かれていて、代わりにmemmove
を使用してください。
ですから、「&」の代わりにした後に「D」の後に文字列の内容を移動することができます。
memmove(andloc + 3, andloc + 5, strlen(andloc + 5) + 1);
はそのような文字列に番号を追加するには、ポインタのアドレスに追加します。そこで古い "and"の文字列の5文字からさらに古い "and"位置の先頭から3文字で始まるスペースにデータをコピーします。コピーする量は、文字列の終わりにNULL文字をコピーするように、 "and"位置の先頭に5文字を加えた文字列の長さ+ 1です。それをやっての
別のマニュアルの方法は、あなたが文字列の終わりを見つけるまで、各文字を反復処理するために、次のようになります。
char *to = andloc + 3;
char *from = andloc + 5;
while (*from) { // Until the end of the string
*to = *from; // Copy one character
to++; // Move to the ...
from++; // ... next character pair
}
*to = 0; // Add the end of string marker.
は、だから今のいずれかの方法は、文字列のメモリが含まれています
Jack & Jill went up the hill\0l\0
\0
は文字列マーカーの末尾なので、実際の文字列 "content"は最初の\0
までとなり、l\0
は無視されます。
これは、小さなもので部品を交換する場合にのみ有効です。文字列のサイズが大きくなるような大きさに置き換える場合は、コンテンツをスクラッチパッドに最初にコピーし、完成した文字列を格納するのに十分な空き領域があることを確認してください(これはmemmove
です。種類のものは、しばしばセキュリティ上の頭痛であり、ハッキングされるシステムの最大の原因の1つである「バッファオーバーラン」の大きな原因です。また、全体を逆方向に行う必要があります。最初に文字列の後半部分を移動して部屋を作り、次に2つの半分の間のギャップを修正します。
あなたのコードはこれまで提供できますか?そして入力配列の例? – Mazaryk
あなたはコピーではなく_replace_を記述します。 'String x ="これとそれ "; x.replace( "and"、 "+"); Serial.println(x); ' – dandavis
これは純粋にプログラミングに関する質問であり、Arduinoの質問ではありません。 VTC。 –