2016-03-06 52 views
2

我正在練習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;的輸出。你可以清楚地看到,這個用戶名和密碼是相同的,雖然他們的值輸入不同,並且名稱,年齡和電子郵件沒有輸入然後...

爲什麼它給我這個錯誤?

+1

您沒有分配給你的'char'陣列的任何記憶。 –

+2

如果您練習C++,您應該瞭解'std :: string'。停止編寫C. – Zulan

+0

如果這段代碼在編譯時不會傳出至少一堆警告,我很驚訝。和一個C++ 14兼容的編譯器不會吃它* *(不'''',哈利路亞!) – WhozCraig

回答

2

更新你的結構看起來像這樣(如果你堅持使用char []來代替std ::當然字符串):

struct signup_form{ 
    char name[100]; 
    char email[100]; 
    unsigned int age; 
    char usr_name[100]; 
    char pass[100]; 
}; 
3

您正在使用的字符串沒有任何內存分配給它。

有2簡單(假設簡單的輸入)的方式來解決這個問題:

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

替代char var[]在struct與string var;

替代

gets(prns.var) 

cin >> prns.var; 

給它嘗試。

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