为什么获取不存储变量中的值?

时间:2016-03-06 08:31:51

标签: c++

我正在练习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;
}

问题出在输出中,其输出如下所示: error

最后一行是cout<< prsn.usr_name<<"\t"<<prsn.pass<<"\t"<<prsn.name<<"\t"<<prsn.email;行的输出。您可以清楚地看到用户名和密码是相同的,尽管它们的值输入不同,但未输入姓名,年龄和电子邮件...

为什么它会给我这个错误?

4 个答案:

答案 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;

试一试。