文字列の終端のヌル文字へのポインタを取得する必要があります。
現在、私はこの単純な方法を使用してMyString + strlen(MyString)
います。これはおそらく文脈から外れて非常に優れています。
ただし、文字列のコピーの後にそれを行う必要があるため、このソリューションには不快です。
char MyString[32];
char* EndOfString;
strcpy(MyString, "Foo");
EndOfString = MyString + strlen(MyString);
strcpy
そのため、最初はで、2 回目は で、文字列を 2 回ループしていますstrlen
。
コピーされた文字数を返すカスタム関数を使用して、このオーバーヘッドを回避したいと思います。
size_t strcpylen(char *strDestination, const char *strSource)
{
size_t len = 0;
while( *strDestination++ = *strSource++ )
len++;
return len;
}
EndOfString = MyString + strcpylen(MyString, "Foobar");
ただし、私の実装は、コンパイラが提供する CRT 関数 (単純な char-by-char ループの代わりに、アセンブリの最適化またはその他のトリックを使用する可能性がある) よりも遅くなる可能性があるのではないかと心配しています。それとも、すでにそれを行っている標準の組み込み関数を認識していないのでしょうか?
0x1FFFFFFF を 3 つのアルゴリズム ( strcpy
+ strlen
、私のバージョンの、strcpylen
およびuser434507のバージョン) で反復して、貧弱なベンチマークを行いました。結果は次のとおりです。
1) strcpy
+strlen
はわずか 967 ミリ秒で勝者です。
2) 私のバージョンはもっと時間がかかります: 57 秒!
3) 編集されたバージョンは 53 秒かかります。
したがって、私の環境でカスタムの「最適化」バージョンの代わりに 2 つの CRT 関数を使用すると、50 倍以上高速になります。