アフィリエイト広告を利用しています

広告

posted by fanblog

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';
}

h11_0061.png



この記事へのコメント
コメントを書く

お名前:

メールアドレス:


ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバックURL
https://fanblogs.jp/tb/7418482
※ブログオーナーが承認したトラックバックのみ表示されます。

この記事へのトラックバック

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


検索
<< 2018年08月 >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
プロフィール
こうすけさんの画像
こうすけ

 たまに、クリック お願いします m(_ _)m

 AA にほんブログ村 IT技術ブログ C/C++へ

こうすけ:メール kousuke_cpp@outlook.jp

【1】★★C++ 記事目次★★ ← 利用可能です。
・新版明解C++入門編 / 新版明解C++中級編
・その他 C++ 関連記事

【2】★★こうすけ@C#★★
・C# の初歩的な記事


×

この広告は30日以上新しい記事の更新がないブログに表示されております。