1

ちょっとした質問です。文字列クラスを使用して文字列を読み取ろうとするとエラーが発生するのはなぜですか? 私が受け取ったエラーは次のとおりです。

cStrings の代わりにこのクラスを使い始めています。残念ながら、cin を使用して文字列を読み取ろうとすると、エラーが発生し続けます。例えば:

void ProcessEditMenuItems( int menu_choice, std::string fname[], std::string lname[], 
                    std::string phone[], std::string bday[]     /*char fname[][NAME_LENGTH], char lname[][NAME_LENGTH], char phone[][NAME_LENGTH], 
                       char bday[][NAME_LENGTH]*/ )
{
switch ( menu_choice )
{
    case 1:
        std::cout << "\nEnter new first name: ";
        std::cin >> fname;
    break;
    case 2:
        std::cout << "\nEnter new last name: ";
        std::cin >> lname;
    break;
    case 3:
        std::cout << "\nEnter new phone number: ";
        std::cin >> phone;
    break;
    case 4:
        std::cout << "\nEnter new birthday: ";
        std::cin >> bday;
    break;
}
}

上記のコードは通常の cString では機能しますが、関数の宣言と定義を文字列クラスに変更すると機能しません。

4

4 に答える 4

3

引数fnamelnamephone、およびは、引数が に変換されるものbdayとして宣言されています。つまり、これらは へのポインタです。s の配列を渡したい場合にのみ、引数を with で宣言します。std::string arg[]std::string* argstd::stringstd::string arg[]std::string

引数ごとに 1 つの引数を渡す場合std::string、実際に必要なのは参照型です。たとえば、 でfnameある必要がありますstd::string& fname。参照を使用するstd::stringと、コピーせずに a を関数に渡すことができるため、参照する>>と元のオブジェクトが変更されます。

于 2013-02-12T17:07:17.510 に答える
2

実際には文字列の配列を渡していますが、文字列への非定数参照を渡す必要があります。

関数プロトタイプを次のように変更します。

void ProcessEditMenuItems(
  int menu_choice,
  std::string& fname,
  std::string& lname,
  std::string& phone,
  std::string& bday
)

そして、それはうまくいくはずです。

C 文字列からstd::stringsに変換する場合、次の変換表を使用できます。

Old parameter | New parameter      | Description
const char*   | const std::string& | Non-modifiable parameter
char*         | std::string&       | Modifiable string

最も良い点は、char*. サイズの増加が必要な場合は、削除/再割り当てを処理する必要もありません。

于 2013-02-12T17:07:44.490 に答える
1

fnameの配列ですstd::string。配列の使用は、以前に C 文字列を使用したことの影響char fname[]ですか? もしそうなら、std::string&代わりにパスに変更できます

void ProcessEditMenuItems(int menu_choice,
                          std::string& fname,
                          std::string& lname,
                          std::string& phone,
                          std::string& bday)
于 2013-02-12T17:06:38.840 に答える