2012-12-06 37 views
0

我有全局变量。我想使用char数据类型,所以我可以在其中插入用户名。到目前为止它不工作。带字符的全局变量

在main.cpp中

#include "Functions.h" 

using namespace std; 

    char username[50]; 

int main() 
{ 
    cout << username; 
} 

在Functions.h

char username[50]; 

在login.cpp

#include "Functions.h" 

       if(std::strcmp(emp_username, "admin") == 1) { 
        username = "admin"; 

       } 

       else 
       { 
        username = emp_username; 

       } 

我想要做的是让员工的用户名和显示器它在每一个功能。它适用于int数据类型。只有我不知道如何用char来使用它。请帮我解决一下这个。谢谢。

+0

HTTP://www.learncpp。 com/cpp-tutorial/42-global-variables/ – 2012-12-06 18:57:18

+1

什么是'emp_username'?为什么你有两个'char用户名[50];? –

+0

@DavidSchwartz:它可以是用户输入的任何名称。 – sg552

回答

2

不要使用普通的字符数组存储字符串,使用std::string类:

std::string username; 
std::string emp_username; 

// Note that this is rather pointless, since it's equivalent to 
// username = emp_username; 
// but I'll leave it as it is to demonstrate how "string" works. 
if (emp_username == "admin") { 
    username = "admin"; 
} else { 
    username = emp_username; 
} 

如果你有强迫你使用普通的数组一些奇怪的要求,然后比较使用:

if (std::strcmp(emp_username, "admin") == 0) // NOT 1 

且内容不能使用=分配;你需要的库函数:

username[sizeof username - 1] = 0; 
std::strncpy(username, emp_username, sizeof username); 
if (username[sizeof username - 1] != 0) { 
    // Whoops! The buffer was too small. Handle the error somehow. 
} 

最后,如果你必须有一个全局变量(这是几乎总是一个好主意),那么你需要声明它extern在标题:

extern std::string username; 
+0

非常感谢:) – sg552

2

在你的头文件中,你需要声明变量“extern”;即extern char username[50];

这意味着“这里是变量的类型和名称,但它是在别的地方定义的”。

如果你声明它没有“extern”,那么包含你的头文件的每个文件最终都会有一个名为“username”的全局变量,如果你幸运的话,那么你的链接器会抱怨重复的变量。

除了在头文件中声明它为“extern”之外,还需要在一个源文件中声明它(不是extern)。

1

main函数是您的程序开始的地方。当您启动程序,你要做的第一件事是:

cout << username; 

这将立即输出username,这在目前还没有充斥着用户名的内容。确保在开始输出用户名之前先进行用户输入。这个(如果我的心理能力是正确的)将需要调用你在login.cpp中定义的函数。所以,无论是函数被调用,调用它:例如:

int main() 
{ 
    login(); 
    cout << username << endl; 
} 

在你login.cpp文件,你有没有任何封闭函数这个if-else语句。我不确定这是否仅仅是因为你复制了文件的一部分,但是这些语句需要在一个函数中。如果您想在其他文件中使用它,您可能需要在头文件中声明该函数。

要分享,你需要声明它的头文件,为extern char username[50],然后只在您的实现文件作为一个定义char username[50]它不同的翻译单位之间的username全局变量。

但是,我不建议使用全局变量来建议您使用std::string而不是char阵列。你可以简单地return用户名出login功能,做这样的事情:

int main() 
{ 
    std::string username = login(); 
    std::cout << username << std::endl; 
} 

在参考这个帖子上的评论:

std::string login() 
{ 
    // Here we get the user's username and return it back to main 
    std::string username; 
    std::cin >> username; 
    return username; 
} 

void menu(std::string username) 
{ 
    std::cout << "Welcome " << username << std::endl; 
} 

int main() 
{ 
    std::string username = login(); // We receive the username from login() 
    menu(username); // We pass the username we received to menu() 
} 
+0

实际上,'username'正被分配给'login_cpp'处的'emp_username'我无法相信你真的帮我调用函数。你是一个好帮手。这个地方充满了不错的人:) – sg552

+0

我其实想要做到这一点。用户在login.cpp处用用户名和密码登录并重定向到main_menu.cpp。在'mainmenu.cpp'我会'cout <<“Welcome”<< username'。我知道这样做的唯一方法是使用全局变量,因为全局变量只在登录期间覆盖一次,其余的是获取全局变量以显示“欢迎用户名”我认为使用全局变量是安全的。再次感谢。 – sg552

+0

全局变量从来就不是必需的(通常被认为是糟糕的设计!)。这听起来像你真正想要的是'int main(){std :: string username = login();菜单(用户名); }' –