2

ここで構造を定義しました

struct Owner{

char* ownerName;char* fatherName;char* address;};


void registerV(Owner *);

main(){

ここで所有者を初期化しています

struct Owner owner;

  owner.ownerName="Imran Ali";
  owner.fatherName="Ali Khokhar";
  owner.adress="KhushalPura";
  registerV(&owner);

}

この関数では、別の関数を使用してメインセクションに表示する必要があるユーザーからの入力を取得しています。しかし、そうしようとすると、ガベージ値が取得されます

void registerV(struct Owner *ownerPtr)
{

 char buyersName[50];
 char fatherName[50];
 char adress[100];

 cin.getline(buyersName, 50);
 cout << " Enter Buyers Name : " ;
 cin.getline(buyersName, 50);
 (*ownerPtr).ownerName=buyersName;

 cout << " Enter Fathers Name : " ;
 cin.getline(fatherName, 50);
 (*ownerPtr).fatherName=fatherName;

 cout << " Enter Adress : " ;
 cin.getline(adress, 100);
 (*ownerPtr).adress=adress;
}

メイン関数から値を表示しようとすると、ガベージ値が取得されます。私を助けてください。

4

4 に答える 4

6

fatherName所有者変数のフィールドは、いったんregisterV終了 するとスコープ外になるデータ ( などのローカル変数) を使用して初期化されます。

ここでの使用を検討しstd::stringますが、メモリ管理と変数のスコープについても理解を深める必要があります。

于 2012-04-17T16:58:02.197 に答える
3

プログラムの個々の問題に対処するのではなく、2 つの一般的な問題に対処させてください。

  1. ポインターを使用しないでください。代わりに、オブジェクトを値で渡したり返したりします。
  2. char配列を使用しないでください。代わりに、を使用してstd::stringください。

代わりにこれを試してください:

// Untested code

#include <iostream>
#include <string>

struct Owner{
  std::string owner;
  std::string father;
  std::string address;
};

Owner registerV();

main(){
  struct Owner owner;

  owner = registerV();
}

Owner registerV() {
  Owner result;

  std::cout << " Enter Buyers Name : ";
  std::getline(std::cin, result.ownerName;

  std::cout << " Enter Fathers Name : " ;
  std::getline(std::cin, result.fatherName);

  std::cout << " Enter Adress : " ;
  std::getline(std::cin, result.address);

  return result;
}
于 2012-04-17T17:02:22.207 に答える
2

Owner owner の前の struct キーワード。不要です。

ポインターを逆参照して (*pStruct).member でメンバーにアクセスする代わりに、pStruct->member で直接アクセスできます。

char ポインターに固執したい場合は、個人的には「登録」関数の本体をメインに配置するだけです。

それでも関数が必要な場合は、std::strcpyを使用して値をテンポラリからメンバーにコピーする必要があります。

于 2012-04-17T17:09:02.497 に答える
0

変数buyersNameとその他は、それらが含まれている関数に対してローカルです。つまり、それらへのポインターは、関数が戻った後は無効です。

最善の解決策は、構造体メンバー変数を適切な C++ 文字列にすることです。

于 2012-04-17T16:58:19.427 に答える