我正在练习c ++,我做了一个简单的程序,询问一些细节,然后将它存储在一个结构中。代码如下所示:
#include<stdio.h>
#include <iostream>
using namespace std;
struct signup_form{
char name[];
char email[];
unsigned int age;
char usr_name[];
char pass[];
};
void signup(){
signup_form prsn;
cout<<"\n\tName: ";
gets(prsn.name);
cout<<"\n\n\tE-mail: ";
gets(prsn.email);
cout<<"\n\n\tage";
cin>>prsn.age;
cin.ignore();
cout<<"\n\n\tUsername: ";
gets(prsn.usr_name);
cout<<"\n\n\tPassword: ";
gets(prsn.pass);
cout<< prsn.usr_name<<"\t"<<prsn.pass<<"\t"<<prsn.name<<"\t"<<prsn.email;
return;
}
int main(){
signup();
return 0;
}
最后一行是cout<< prsn.usr_name<<"\t"<<prsn.pass<<"\t"<<prsn.name<<"\t"<<prsn.email;
行的输出。您可以清楚地看到用户名和密码是相同的,尽管它们的值输入不同,但未输入姓名,年龄和电子邮件...
为什么它会给我这个错误?
答案 0 :(得分:3)
您正在使用字符串而不为其分配任何内存。
有两个简单的(假设简单输入)方法来解决这个问题:
const int MAX_STR_SIZE = 256;
struct signup_form{
char name[MAX_STR_SIZE];
char email[MAX_STR_SIZE];
unsigned int age;
char usr_name[MAX_STR_SIZE];
char pass[MAX_STR_SIZE];
};
或更有效的方式(从内存管理的角度来看)您可以使用标准C ++库中的类字符串:
struct signup_form{
std::string name;
std::string email;
unsigned int age;
std::string usr_name;
std::string pass;
};
答案 1 :(得分:3)
正如其他人已经在评论中指出的那样,你做错了什么。我不是在谈论代码中的错误。你正在混合使用C和C ++。有些人认为,C ++是超集或C,但事实并非如此。如果您愿意学习C ++,请使用C ++而不是C.它们是不同的语言。
现在,根据你的代码。你有char[]
这是C ++标准std::string
的低级版本,需要用户进行内存管理。
gets
是类似C的函数,它需要在目标中分配内存。你没有为它提供任何空间。
要修复代码,请使用C ++
struct signup_form{
std::string name;
std::string email;
unsigned int age;
std::string usr_name;
std::string pass;
};
void signup(){
signup_form prsn;
cout << "\n\tName: ";
std::getline(std::cin, prsn.name);
答案 2 :(得分:2)
更新你的结构看起来像这样(如果你坚持使用char []而不是std :: string当然):
struct signup_form{
char name[100];
char email[100];
unsigned int age;
char usr_name[100];
char pass[100];
};
答案 3 :(得分:1)
用char var[]
string var;
替换
gets(prns.var)
带
cin >> prns.var;
试一试。