2009-08-29 7 views
0

NoobからC++。シンプルなC++コード(何が間違っていますか?)

私はユーザー入力(姓、名のミドルネーム)を取得しようとしています。ミドルネームをミドルネームに変更してから、再配置します。

私のコードではどこがうんざりですか?

- ご提供いただけるお手伝いがありがとうございます。

...

#include <iostream> 
using std::cout; 
using std::cin; 

#include <string> 
using std::string; 

int main() 
{ 

    string myString, last, first, middle; 

    cout << "Enter your name: Last, First Middle"; 

    cin >> last >> first >> middle; 

    char comma, space1, space2; 

    comma = myString.find_first_of(','); 
    space1 = myString.find_first_of(' '); 
    space2 = myString.find_last_of(' '); 

    last = myString.substr (0, comma); // user input last name 
    first = myString.substr (space1+1, -1); // user input first name 
    middle = myString.substr (space2+1, -1); // user input middle name 

    middle.insert (0, space2+1); // inserts middle initial in front of middle name 
    middle.erase (1, -1); // deletes full middle name, leaving only middle initial 

    myString = first + ' ' + middle + ' ' + last; // 

    return 0; 
} 

答えて

12

は、この行はいけません。

cin >> last >> first >> middle; 

cin >> myString; 

こと?

その後、myStringのカンマと空白を検索しますが、この文字列には何も含まれていないためです。

+5

これは、最初のスペースで行の読み取りを停止するため、機能しません。 –

+3

どのようにこれは非常に多くのupvotesを得る...彼らはスペースを使わずに自分の名前を入力しない限り動作しません... – DeusAduro

+0

@DeusAduro私はどちらかを理解していない、なぜ私はlitbのコメントとanvser upvoted。 JWはLitbの回答を受け入れて、ページに上がってハイライト表示されるようにする必要があります。 – p4bl0

14

よく、myStringのものを検索しますが、何も設定しません(空の文字列です)。

myStringに1行全体を読んでください。

std::getline(std::cin, myString); 

次に、第二の問題は、あなたがカンマ、SPACE1とSPACE2の種類としてsize_tを使用する必要があるということです,、スペースなどのために外を見ることができます。これらは、文字列内のスペースとカンマの位置を保持します。コンマまたはスペースが入力に見つからない場合、検索関数はstring::nposを返します。size_tの中で最も高い値です。しかし、これはcharをオーバーフローします。確実に位置を割り当てるために、これら3つの変数のタイプをsize_tに変更する必要があります。

-1を使用する代わりに、終了するまで部分文字列を抽出すると言うと、そのパラメータのデフォルトの引数はstring::nposです。実際にそれを渡したい場合は、可読性を向上させるために、代わりにstring::nposを使用してください:正しいタイプ(size_t)で、int(値-1)の変換は必要ありません。代わりに、非常に多くのusing文をdeclearingの

0

はまた、あなただけの名前空間std を含むことができ、それは次のようになります。

//include headers.. 
using namespace std; 
1

コードを修正しました。

#include <iostream> 
#include <string> 
using namespace std; 

int main() 
{ 

    string myString, last, first, middle; 

    cout << "Enter your name: Last, First Middle" << endl; 

    getline(cin, myString); 

    char comma, space1, space2; 

    comma = myString.find_first_of(','); 
    space1 = myString.find_first_of(' '); 
    space2 = myString.find_last_of(' '); 

    last = myString.substr (0, comma); // user input last name 
    first = myString.substr (space1+1, space2 - space1); // user input first name 
    middle = myString.substr (space2+1, -1); // user input middle name 

    middle.erase(1, -1); // erases full middle name, only leaving the first character as initial 

    cout << first << " " << middle << ". " << last << endl;//displays output 

    return 0; 
} 

より簡単な方法は、名前空間全体を宣言することです。

using namespace std; 

入力文字列に空白を含める場合は、getline()を使用してください。右ここ

getline(cin, myString); 

、あなたは他のfirstは喜んで文字列入力の残りの部分を割り当てられます、2番目のパラメータに-1を使用しないでください。

first = myString.substr (space1+1, space2 - space1); 

また、機能middle.eraseは本当にこのことについてに行くには良い方法は、あなたが最初の文字の後にすべてのものを取り除くためにしようとしているとしてだけ-1を書くことで、パラメータとして文字を受け入れることはできません。

middle.erase(1, -1); 

最後に、myString = first + ' ' + middle + ' ' + last;はありません。私はあなたが結果を表示しようとしていると仮定します。std::coutはうまくいくでしょう。

cout << first << " " << middle << ". " << last << endl; 
関連する問題