1

二次元配列の比較で困っています。ユーザーにユーザー名とパスワードを要求し、入力を事前定義されたユーザー名のリストと比較する疑似ログイン システムを作成する必要があります。

この関数では、定義済みのユーザー名は で表され、*sユーザー入力は*s1です。コンパイルしようとすると、この厄介なトラブルメーカーが表示されます。

68 D:\Personal\Dev-Cpp\projects\loginSysTest\main.cpp char' toconstからの無効な変換

strncmpステートメントの機能についてif

これはコードです:

#define nameLenght 30
#define User 10

char usernames[User][User] = {{"student"}, {"admin"}, {"Deus Ex Machina"}};

//=====================================================================
int main(int argc, char *argv[])
{
    char usernameInput[nameLenght + 1] = {0};
    gets(usernameInput);
    int login = compS(*usernames, usernameInput);

    if(login == 0)
        printf("Access Granted! \n");
    else 
        printf("Access Denied!");

    system("PAUSE");    
    return 0;
}
//=====================================================================        

int compS(char *s, char *s1)
{ 
    for(int k = 0 ;k < nameLenght; k++)
    {
        if(strncmp(s[k], s1, strlen(s1)) == 0)
        return 1;  
    }
}

前もって感謝します。

4

3 に答える 3

4

次の行に沿ってstd::vectorand を使用するだけです。std::string

std::vector<std::string> usernames({"student", "admin", "Deus Ex Machina"});
std::string input;
std::cin >> input;
if (std::find(begin(usernames), end(usernames), input) != end(usernames))
    std::cout << "Access Granted!\n";
else std::cout << "Access Denied!\n";

Live demo

于 2015-12-22T21:54:26.330 に答える
0

これを実現する方法はいくつかあります。これが最初に思いつく方法です。

char* usernames[] = { "student" , "admin", "Deus Ex Machina", NULL };

int compS(char **s, char *s1)
{
    for (int k = 0; s[k] != NULL; k++)
    {
        if (strncmp(s[k], s1, strlen(s1)) == 0)
            return 0;
    }
    return 1;
}

文字列へのポインターを strncmp() に渡す必要があるため、配列を文字列へのポインターの配列に変更しました。配列の最後には null ポインターがあり、ループが最後に到達したことを知ることができます。

于 2015-12-27T12:16:55.010 に答える