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 での使用方法がわかりません。これで私を助けてください。ありがとうございました。

4

3 に答える 3

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;
于 2012-12-06T19:00:21.173 に答える
2

ヘッダーファイルで、変数「extern」を宣言する必要があります。すなわち、extern char username[50];

これは、「変数のタイプと名前ですが、別の場所で定義されている」という意味です。

「extern」なしで宣言すると、ヘッダーファイルを含む各ファイルは「username」という名前のグローバル変数になります。運が良ければ、リンカーは重複変数について文句を言います。

ヘッダーファイルで「extern」と宣言するとともに、1つのソースファイルで(externではなく)宣言する必要があります。

于 2012-12-06T18:58:49.137 に答える
1

main関数は、プログラムが始まる場所です。プログラムを開始して最初に行うことは次のとおりです。

cout << username;

usernameこれにより、現時点ではユーザー名が入力されていないの内容がすぐに出力されます。ユーザー名の出力を開始する前に、必ずユーザー入力を行ってください。これには (私の超能力が正しければ)、login.cpp で定義している関数を呼び出す必要があります。したがって、その関数が呼び出されるものは何でも、それを呼び出します。たとえば、次のようにします。

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

login.cpp ファイルには、囲み関数のないこの if-else ステートメントがあります。ファイルの一部のみをコピーしたためかどうかはわかりませんが、これらのステートメントは関数内にある必要があります。他のファイルで使用する場合は、おそらくヘッダー ファイルでその関数を宣言する必要があります。

username異なる翻訳単位間でグローバル変数を共有するには、ヘッダー ファイルで as として宣言しextern char username[50]、実装ファイルの 1 つだけで as として定義する必要がありますchar username[50]

ただし、これにグローバル変数を使用することはお勧めしません。配列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()
}
于 2012-12-06T19:01:13.293 に答える