C++ неверное преобразование из 'char' в 'const char'

У меня проблемы с двумерным сравнением массивов. Мне нужно создать систему псевдо-входа в систему, которая запрашивает у пользователя имя пользователя и пароль, а затем сравнивает входные данные с предопределенным списком имен пользователей.

В функции предопределенные имена пользователей представлены *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;  
    }
}

Заранее спасибо.

3 ответа

Просто используйте std::vector а также 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";

Живая демо

Если вы хотите (или нуждаетесь) сохранить свой код в стиле C не очень-то и не очень безопасно, вы можете написать

strncmp(s + (k+nameLenght), s1, strlen(s1))

Это скомпилирует и, возможно, будет работать с некоторыми дополнительными усилиями, но вам придется исправить usernames размеры и на самом деле вызов compS,

Посмотрите этот другой ответ для более безопасного кода в стиле C++.

Есть несколько способов сделать это. Это первый способ, который приходит на ум.

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(), поэтому я изменил ваш массив на массив указателей на строки. Массив имеет нулевой указатель в конце, чтобы позволить циклу узнать, когда он достиг конца.

Другие вопросы по тегам