ポインタは実際には単一のオブジェクトchar*
を指しているだけです。char
そのオブジェクトが文字列の最初の(または任意の)要素である場合は、ポインタ演算を使用して、その文字列の他の要素にアクセスできます。これは、文字列(C ++スタイルのstd::string
オブジェクトではなくCスタイルの文字列)の一般的な方法です。アクセスしました。
(Cスタイルの)文字列は、ヌル文字(' \0
')で終了する文字のシーケンスです。('\0'
ターミネータの後は文字列の一部ではありません。)したがって、文字列"foo bar"
は次の一連の文字で構成されます。
{ 'f', 'o', 'o', ' ', 'b', 'a', 'r', '\0' }
文字列を"foo bar"
から単にに変更する場合"foo"
、それを行う1つの方法は、スペース文字をヌル文字に置き換えることです。
{ 'f', 'o', 'o', '\0', ... }
これ...
は構文の一部ではありません。まだ存在しているが(、、、)、文字列の一部ではなくなった文字'b'
を'a'
表し'r'
ます'\0'
。
std::string
C ++を使用しているので、おそらく;を使用したほうがはるかに良いでしょう。これははるかに強力で柔軟性があり、ターミネータ、メモリ割り当て、およびその他の詳細について心配する必要がありません。(もちろん、この演習の目的がCスタイルの文字列のしくみを学ぶことでない限り。)
これにより、が指す文字列が変更され、file
その変更が呼び出し元に表示されることに注意してください。文字列のローカルコピーを作成することで、これを回避できます(これには、スペースを割り当て、後でそのスペースを解放する必要があります)。繰り返しstd::string
ますが、この種のことははるかに簡単になります。
最後に、これ:
strncpy(file, file, j);
いくつかのレベルで悪いです。strncpy()
このように送信元と宛先が重複している場合の呼び出しの動作は未定義です。文字通り何でも起こり得ます。またstrncpy()
、宛先に適切なNULターミネータを提供する必要はありません。ある意味でstrncpy()
は、実際には文字列関数ではありません。存在しないふりをしたほうがいいでしょう。
トピックに関する私の暴言を参照してください。