「C++/標準テンプレートライブラリ」の版間の差分

削除された内容 追加された内容
M 内容の調整
Ef3 (トーク | 投稿記録)
→‎文字列: <cstring> でなけ <string.h> をインクルードしているので strlen() に std:: は不要。 s/char型のポインタ/NULL文字で終端されたchar型の配列/
タグ: 2017年版ソースエディター
4 行
 
== 文字列 ==
CではNULL文字で終端されたchar型のポインタ配列 (以下、C形式の文字列) を用いる事で文字列を操作します。
以下の例を見てください。
 
27 行
</syntaxhighlight>
 
C++では、C形式の文字列の代わりに{{code|std::string}} (以下、単に{{code|string}}) クラスを用いて文字列操作を行うことができます。
{{code|string}}クラスを使って上記のコードと同じ働きをするコードを書くと、次のようになります。
 
例2: 例1と同じ動作をするコード
65 行
void func(const char* s1)
{
char s2[256]; //<--s1の文字列サイズチェックがないとs2にコピーあるいは追加するにバッファオーバーフローランが発生する可能性ある
 
strcpy(s2, s1); /* 文字列のコピー */
71 行
strcat(s2, s1); /* 文字列の追加 */
printf("%s\n", s2);
printf("%zu\n", std::strlen(s2)); /* 文字列のサイズ */
}
 
85 行
 
例3では{{code|func()}}は{{code|main()}}からしか呼ばれません。
しかし、{{code|func()}}に渡された文字列の長さをチェックしないと、s2に対して範囲外へのアクセスを行う可能性があるため危険です<ref group="注">257文字以上の文字列を{{code|func()}}に渡すと[[W:ッファオーバーラン|バッファオーバーラン]]を起こし関数の戻り番地が書き換えられるなどの原因なります</ref>。
 
これに対してC++バージョンを関数分割すると、次のようになります。
次のようになります。
 
例4: 例2を関数に分割したバージョン
116 ⟶ 115行目:
</syntaxhighlight>
 
{{code|string}}クラスは必要に応じて内部のバッファが拡張されるので、引数で渡された文字列のサイズを気にせずコピーや追加を行うことが出来ます。
 
== 注釈 ==