我在vs 2008中试用这段代码
#include <stdio.h>
#include <iostream>
#include <string>
typedef struct _first
{
int age;
std::string name;
}first;
typedef struct _second
{
int age;
char name[20];
}second;
void copy_structure()
{
first s;
second f;
f.age = 15;
cout<<"Enter the name"<<endl;
fgets(f.name, 20, stdin);
memcpy(&s,&f,20);
cout << "Name: " << s.name << endl;
cout << "Age: "<< s.age << endl;
}
int main()
{
copy_structure();
return 0;
}
在构建时我没有收到任何错误,但是当我运行时,名字字段在这里是空的
cout << "Name: " << s.name << endl;
我在这里没有得到任何输出,有人可以帮我解决这个问题。
答案 0 :(得分:0)
您应该使用基于成员复制的方法。例如
void copy_structure()
{
first f;
^^
second s;
^^
s.age = 15;
cout<<"Enter the name"<<endl;
fgets(s.name, 20, stdin);
f.age = s.age;
f.name = s.name;
cout << "Name: " << f.name << endl;
cout << "Age: "<< f.age << endl;
}
否则将覆盖类型std::string
的对象名称的内部,并且程序将具有未定义的行为。
答案 1 :(得分:0)
这看起来像C但不像C ++ ...你当前的代码也会破坏你的std :: string实例。 memcpy是危险的,不应该使用,除非你有一个非常非常好的理由。到目前为止,我从来没有理由这样做。
我的建议:
#include <iostream>
#include <string>
using namespace std;
struct second
{
int age;
char name[20];
};
struct first
{
int age;
string name;
first& operator=(const second& rhs);
};
// some operator for copying
first& first::operator=(const second& rhs)
{
age = rhs.age;
name = rhs.name;
return *this;
}
int main()
{
first s;
second f;
f.age = 15;
cout << "Enter your name" << endl;
cin >> f.name;
s = f;
cout << "Name: " << s.name << endl;
cout << "Age: " << s.age << endl;
return 0;
}
当然,这是可以改进的。您通常宁愿使用类而不是结构。你也可能有一个运算符&gt;&gt;第二次。