[解決済み] C++におけるstring型とchar[]型の違いについて
疑問点
C言語を少し知っていて、今C++を見ているところです。 私はCの文字列を扱うためのchar配列に慣れていますが、C++のコードを見ていると、文字列型とchar配列の両方を使用する例があることがわかります。
#include <iostream>
#include <string>
using namespace std;
int main () {
string mystr;
cout << "What's your name? ";
getline (cin, mystr);
cout << "Hello " << mystr << ".\n";
cout << "What is your favorite team? ";
getline (cin, mystr);
cout << "I like " << mystr << " too!\n";
return 0;
}
と
#include <iostream>
using namespace std;
int main () {
char name[256], title[256];
cout << "Enter your name: ";
cin.getline (name,256);
cout << "Enter your favourite movie: ";
cin.getline (title,256);
cout << name << "'s favourite movie is " << title;
return 0;
}
(どちらの例も http://www.cplusplus.com )
これは広く聞かれ、答えられた(明白な?)質問だと思いますが、C++で文字列を扱うためのこの2つの方法の違い(パフォーマンス、API統合、それぞれが優れている方法、...)を正確に教えてくれる人がいればうれしいです。
ありがとうございます。
どのように解決するのですか?
char配列は、まさに文字の配列です。
- (あなたの例のように) スタック上に割り当てられた場合、それが含むテキストの長さに関係なく、常に例えば 256 バイトを占めます。
- ヒープ上に割り当てられた場合 (malloc() または new char[] を使用)、その後メモリを解放する責任があり、ヒープ割り当てのオーバーヘッドが常に発生します。
- 256 文字以上のテキストを配列にコピーすると、クラッシュしたり、醜いアサーションメッセージを生成したり、プログラムのどこかで説明のつかない (誤った) 動作を引き起こす可能性があります。
- テキストの長さを決定するために、配列は一文字ずつスキャンされ、"second "文字を探さなければなりません。
文字列は、文字配列を含むクラスですが、自動的に管理されます。ほとんどの文字列の実装は16文字の配列を内蔵しており(短い文字列がヒープを断片化しないように)、長い文字列にはヒープを使用します。
文字列のchar配列にはこのようにアクセスできます。
std::string myString = "Hello World";
const char *myStringChars = myString.c_str();
C++の文字列は、埋め込まれた "0 "文字を含むことができ、カウントしなくても長さがわかり、短いテキストではヒープに割り当てられた文字配列より速く、バッファオーバーランから保護されます。さらに、可読性が高く、使いやすいのです。
なぜなら、そのような DLL 関数のユーザーは、文字列クラスが異なる動作をする危険を冒さないように、まったく同じコンパイラと C++ ランタイム実装を使用していることを確認する必要があるからです。
通常、文字列クラスは呼び出し側ヒープでそのヒープメモリを解放するので、ランタイムの共有 (.dll または .so) バージョンを使用している場合にのみ、メモリを再び解放することができます。
要するに、すべての内部関数とメソッドで C++ 文字列を使用します。.dll または .so を書くことがあれば、公開 (dll/so-exposed) 関数で C 文字列を使用してください。
関連
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】ファイルから整数を読み込んで配列に格納する C++ 【クローズド
-
[解決済み】CMakeエラー at CMakeLists.txt:30 (project)。CMAKE_C_COMPILER が見つかりませんでした。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】デバッグアサーションに失敗しました