2012-03-04 9 views
8

私はC++を学んでいますが、現在は文字列とポインタを扱っています。C++の文字列とポインタ

私は、練習帳、次のことだし、私が作成した質問のいずれかの次

#include <iostream> 
#include <string> 

using namespace std; 

int main(void){ 
    string * firstName=nullptr; 
    string * lastName=nullptr; 
    string * displayName=nullptr; 

    cout << "Enter your first name: " << endl; 
    getline(cin,*firstName); 

    cout << "Enter your last name: " << endl; 
    getline(cin,*lastName); 

    displayName=new string; 
    *displayName= *lastName + ", " + *firstName; 

    cout << "Here's the information in a single string: " << displayName; 
    cin.get(); 
    return 0; 
} 

のポインタのより多くの私は文字列と一緒にそれをミックスしようとした使用する入札でこの理由からソリューションがより複雑になっています。私がこれを実行すると、「処理されない例外:アクセス違反が場所xxxxxxxxxを読み込む」というメッセージが表示されます。

誰かがchar配列の代わりにポインタと文字列を使用して解決策を提案することができますか?

+3

あなたは文字列を割り当てておらず、次に 'getline()'関数にヌルポインタを渡します。単に文字列* x = nullptr;をすべて変更してください。あなたが 'getline()'に渡す前に、あなたが 'displayName'と同じように文字列を割り当てます。 – Yaniro

+1

" learn C++ "を始めたばかりの人は、生ポインタの近くに行ってはいけません。彼らはC++の困難で高度な、ニッチな部分であり、ほとんどの「通常の」プログラミング活動では必要ないはずです。 –

+0

この[ビデオスニペット](http://www.youtube.com/watch?v=i49_SNt4yfk)は、私がポインタについて混乱したときに常に非常に感銘を受けました;-) –

答えて

12

あなたは前にそれらを使用するあなたのオブジェクトを割り当てていないので、これは次のとおりです。

string * firstName = new string(); 
//... 
delete firstName; 

それはこのような状況で、ポインタを使用すると、無意味な、よく、であることを追加する価値がある:標準C++ライブラリでの文字列オブジェクトを割り当てますヒープからの文字列のデータ。文字列は通常、とにかく一対のポインタではありません。

+4

haha​​ha pointless: ') – Rishi

2

それは次のようになります。

int main() 
{ 
    std::string* s = new std::string; 
    std::getline(std::cin, *s); 
    std::cout << *s; 
    delete s; 
} 

しかし、そうする理由は本当にありません、ただ、スタック上の通常の文字列変数を定義します。

0

あなたがnullptrを使っているので、私は本格的なC++ 11解決策が均等に罰金だと思い:あなたが望んでいなかった。もちろん、

#include <iostream> 
#include <memory> 
#include <string> 

using namespace std; 

int main(void){ 
    unique_ptr<string> firstName(new string()); 
    unique_ptr<string> lastName(new string()); 
    unique_ptr<string> displayName(new string()); 

    cout << "Enter your first name: " << endl; 
    getline(cin,*firstName); 

    cout << "Enter your last name: " << endl; 
    getline(cin,*lastName); 

    *displayName= *lastName + ", " + *firstName; 

    cout << "Here's the information in a single string: " << *displayName; 
} 

nullptrを使用して:あなたは、リソースを割り当てる必要があります使いたい

これらの単純なケースでポインタを使用すると、足で自分自身を撮影していることに注意してください。構文上もバグもありません。

EDIT私はコード(忘れ括弧とmainの最後の行に*)を修正し、それがsuccesfulyコンパイルし、GCC 4.7で実行されます。

+0

ありがとうございました。私はまだxstringファイルから未処理の例外エラーが発生します。ビジュアルスタジオに問題があるとお考えですか?私はこれをやってはならないことを感謝します。私はそれから離れ、文字列を使う基本に固執します。 – Dan

+0

@Danがコードを修正しました。 – rubenvb

2

私は、pointersを使用したくないと思います。あなたはポインタなしでstringsで作業することができます。

cout << "Enter your first name: " << endl; 
    firstName = new string(); 
    getline(cin,*firstName); 

...と間接参照演算子と印刷結果(*):あなたは、ポインタを必要とする場合

#include <iostream> 
#include <string> 

using namespace std; 

int main(void){ 
    string firstName; 
    string lastName; 
    string displayName; 

    cout << "Enter your first name: " << endl; 
    getline(cin,firstName); 

    cout << "Enter your last name: " << endl; 
    getline(cin,lastName); 

    displayName= lastName + ", " + firstName; 

    cout << "Here's the information in a single string: " << displayName; 
    cin.get(); 
    return 0; 
} 

Othewise、あなたは変数のためのメモリを割り当てる必要が

cout << "Here's the information in a single string: " << *displayName; 
0

読みます10 commandments of c programming。いくつかは、多かれ少なかれ廃止され、今日の開発者のためのものであるが、いくつかは、このような第二一つとして、やはり重要です:

汝、その端部にあなたを待って混沌と狂気のため、NULLポインタをたどることなかれ。

これは実際にあなたがここでやっていることです。あなたのポインタはどこにも向いていません(std::nullptrへの割り当て参照)。

これを修正するには、正しいクラス/構造体の新しいオブジェクトをポインタに割り当てる必要があります。また、後でそれを削除することを忘れないでください:あなたは、ポインタのように文字列を使用していて、それらを初期化していないので、あなたがエラーを取得している

std::string *myString = new std::string(); // create an object and assign it's address to the pointer 

// do something with it... (this part has been right) 

delete myString; // free the memory used by the object 
2

。これを行うための正しい方法は次のようになります。

#include <iostream> 
#include <string> 

using namespace std; 

int main(void){ 
    string firstName; 
    string lastName; 
    string displayName; 

    cout << "Enter your first name: " << endl; 
    cin >> firstName; 

    cout << "Enter your last name: " << endl; 
    cin >> lastName; 

    displayName = firstname + ' ' + lastName; 


    cout << "Here's the information in a single string: " << displayName << endl; 
    return 0; 
} 

(ご希望の場合、またはconstの参照を)あなたが実際に文字列へのポインタを使用することができるが、それらはローカルオブジェクトとして使用されることを意味し、参照として周りに渡されます。

1

nullポインタを逆参照しているため、アクセス違反が発生しています。

ヌルポインタは

ここ

string * firstName=nullptr; 
を設定し、あなたが何か(この場合は文字列)にfirstnameの 'ポイント' を持っている必要があり、ここで

getline(cin,*firstName) 

逆参照されます。 ここには例外なく変更されたバージョンがあります。

+0

こんにちは、これはまだ私に未処理の例外を与えます。私はこの方法から自分自身を止めて、簡単なルートに固執するでしょう。ありがとう – Dan

+0

ちょうど私がプログラムを修正した後にエラーを引き起こしていた私を考え出した。助けに感謝します。 – Dan

関連する問題