1

私は現在C/C ++を自分で学んでおり、(読んでいる本から)次のような出力を作成できるプログラムを作成するための演習を行いました。

Enter your first name: Flip
Enter your last name: Fleming
Here’s the information in a single string: Fleming, Flip

構造の使用。しかし、私の出力は次のようになります。

Enter your first name: Flip
Enter your last name: Fleming
Here’s the information in a single string: , 

これがコードです。かなり短くてシンプルなので、読みづらいことはありません:)

#include <iostream>
#include <cstring>

using namespace std;

struct Person {
    char* firstName;
    char* lastName;
};

char* getName(void);

int main() {
    Person* ps = new Person;
    cout << "Enter your first name: ";
    char* name;
    name = getName();
    ps->firstName = name;
    cout << "Enter your last name: ";
    char* lastname;
    lastname = getName();
    ps->lastName = lastname;
    cout << "Here's the information in a single string: "
            << ps->lastName << ", " << ps->firstName;
    delete ps;
    delete name;
    delete lastname;

    return 0;
}

char* getName() {
    char temp[100];
    cin >> temp;
    cin.getline(temp, 100);
    char* pn = new char[strlen(temp) + 1];
    strcpy(pn, temp);

    return pn;
}
4

4 に答える 4

5

まず、C /C++のようなものはありません。あなたはそれらを混ぜています、それは間違っています。C++ヘッダーを使用しているので// newusingC ++が必要だと思いますので、コードを修正する方法は次のとおりです。

  • char*すべてを置き換えchar[]std::string
  • 動的割り当てを取り除く

したがって、いくつかの変更は次のようになります。

struct Person {
    std::string firstName;
    std::string lastName;
};

また

Person ps;
于 2012-10-30T11:40:39.150 に答える
3

使用しているもの:

cin >> temp;
cin.getline(temp, 100);

行末の空の文字列で、すでに持っているものを上書きする可能性があります。

それらの1つだけを使用してください。

使用を続ける場合は、バッファオーバーフローを防ぐためcin >>の設定を検討してください。width()

于 2012-10-30T11:41:24.330 に答える
2

いやいやいや、wayyyyは複雑すぎる。実際のC++イディオムを使用します。プログラムは次のように単純である可能性があります。

#include <string>
#include <iostream>

int main()
{
    std::string firstName, lastName;

    if (!(std::cout << "Your first name: "  &&
          std::getline(std::cin, firstName) &&
          std::cout << "Your last name: "   &&
          std::getline(std::cin, lastName)     ))
    {
        std::cerr << "Error: unexpected end of input!\n";
        return 0;
    }

    std::cout << "You are " << firstName << " " << lastName << ".\n";
}

getlineテーマのバリエーションとして、ユーザーが空でない行を入力するまで、それぞれをループに入れることができます。

std::cout >> "Your first name: ";
for ( ; ; )
{
    if (!(std::getline(std::cin, firstName))
    {
        std::cerr << "Error: unexpected end of input.\n"; 
        return 0;
    }
    if (!firstName.empty())
    {
        break;
    }
    std::cout << "Sorry, please repeat - your first name: ";
}
于 2012-10-30T11:44:06.500 に答える
2

まず、当面の問題は、std::cin:から2回読み取ることです。最初にoperator>>、を使用し、次に。を使用しgetlineます。どちらかを選択してください。

しかし、コードを少し単純化しましょう。エラーの原因が多すぎるだけです。ポインタは、間違ったものを指している可能性があるため、またはオブジェクトの削除を忘れたり、オブジェクトを2回削除したりする可能性があるため、注意が必要です。文字列としてのCスタイルのchar配列は、文字列ではなく、文字列のように動作しないため、良くありません。

それでは、標準ライブラリの文字列クラスを使用しましょう。

#include <iostream>
#include <string>

struct Person {
    std::string firstName;
    std::string lastName;
};

std::string getName(void);

int main() {
    Person ps;
    cout << "Enter your first name: ";
    std::string name = getName();
    ps.firstName = name;
    cout << "Enter your last name: ";
    std::string lastname = getName();
    ps.lastName = lastname;
    cout << "Here's the information in a single string: "
            << ps.lastName << ", " << ps.firstName;
}

std::string getName() {
    std::string temp;
    std::getline(cin, temp);
    return temp;
}

これはかなり単純で、ほとんど機械的な置換であり、基本的には、で置換char*std::string、不要になったビットを削除するだけです。

もちろん、コメントで指摘されているように、実際のプログラムが確実に実行する必要があるすべての形式のエラーチェックを省略しました。

于 2012-10-30T11:56:43.470 に答える