2018年03月11日
《その327》 C言語型文字列への変換
string型文字列からC言語型文字列への変換
stringクラスのメンバ関数 c_str は、string型文字列をC言語型文字列に変換します。
関数 c_str
関数 c_strは、受け取った string型文字列を、格納領域を確保し末尾にナル文字を付加した上で、格納します。
c_str関数の返却値は、その格納領域へのポインタです。
下記のプログラムでは、最初に stringオブジェクト s を生成しています。
string s("abcdef");
ポインタ p と配列 a は、それぞれ、string型文字列をC言語型文字列として受け取るためのものです。
const char* p;
char a[20];
次に、
p = s.c_str();
として、c_str関数が返すポインタを受け取ります。
配列 a への代入は、strcpy関数を用いて、
strcpy(a, s.c_str());
としました。
strcpy関数はバッファオーバーフローを発生させやすいので、C++17 では、コピー先のバッファサイズを指定できる strcpy_s関数を使えという警告を出してコンパイルを通してくれません。
プログラムの最初の行
#pragma warning(disable:4996)
は、その警告を避けるためです。
#define _CRT_SECURE_NO_WARNINGS
としても大丈夫です。
プログラムでは次に、文字列 s, p, a を表示させていますが、当然、すべて同じ結果です。
cout << s;
cout << p;
cout << a;
続いて、
s.append("123");
として、文字列 s を変更した上で、文字列 s, p, a を表示させます。
cout << s;
cout << p;
cout << a;
文字列 s の変更は、ポインタ p の指す先の変更ですから、文字列 p は、その影響を受けてしまいます。
以下は、プログラムです。
#pragma warning(disable:4996)
#include <string>
#include <iostream>
using namespace std;
int main() {
string s("abcdef");
const char* p;
char a[20];
p = s.c_str();
strcpy(a, s.c_str());
cout << "s -- " << s << '\n';
cout << "p -- " << p << '\n';
cout << "a -- " << a << "\n\n";
s.append("123");
cout << "s -- " << s << '\n';
cout << "p -- " << p << '\n';
cout << "a -- " << a << '\n';
}
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7418482
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック