如何使用C ++中的函数更新结构的值?

时间:2012-04-17 16:53:24

标签: c++

我在这里定义了一个结构

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;
}

当我尝试从main函数中查看值时,我得到了垃圾值。请帮帮我。

4 个答案:

答案 0 :(得分:6)

所有者变量的字段使用数据(fatherName等局部变量)初始化,一旦registerV退出,就会超出范围。

在此处查看使用std::string,但您还需要更好地了解内存管理和变量范围。

答案 1 :(得分:3)

让我解决两个一般性问题:

,而不是解决程序中的每个问题
  1. 不要使用指针。相反,按值传递和返回对象。
  2. 不要使用char数组。相反,请使用std::string
  3. 请改为尝试:

    // 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;
    }
    

答案 2 :(得分:2)

所有者所有者之前的struct关键字;没必要。

您可以使用pStruct-&gt;成员直接访问它们,而不是取消引用指针并使用(* pStruct).member访问其成员。

如果你想坚持使用char指针,我个人只需将你的“注册”功能的主体放在main中。

如果您仍然需要该功能,则应使用临时工具中的std::strcpy复制该值。

答案 3 :(得分:0)

变量buyersName和其他变量是它们所在函数的本地变量,这意味着函数返回后它们的指针无效。

最好的解决方案是使结构成员变量成为正确的C ++字符串。