C++ 从 'char' 到 'const char' 的无效转换

Posted

技术标签:

【中文标题】C++ 从 \'char\' 到 \'const char\' 的无效转换【英文标题】:C++ invalid conversion from 'char' to 'const char'C++ 从 'char' 到 'const char' 的无效转换 【发布时间】:2015-12-22 21:38:06 【问题描述】:

我在进行二维数组比较时遇到了问题。我需要创建一个伪登录系统,要求用户输入用户名和密码,然后将输入与预定义的用户名列表进行比较。

在函数中,预定义的用户名由*s 表示,用户输入为*s1。当我尝试编译它时,出现了这个讨厌的麻烦制造者:

68 D:\Personal\Dev-Cpp\projects\loginSysTest\main.cpp 来自char' toconst 的无效转换

关于if 语句中的strncmp 函数。

这是代码:

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

提前谢谢你。

【问题讨论】:

s[k]char,而不是 char*。您是否打算拥有char** s(不能与二维数组一起使用)? (我怀疑你为了阻止编译器抱怨而加入了一两个演员表。这通常是个坏主意。) 无关注释:“Deus Ex Machina”是 16 个字符(包括 '\0'),您将其存储在 [10][10] 数组的元素中 请说明您如何要求输入。如果是fgets(),你是否清除了尾随的newline What0s compS 应该再做什么? 应该是char usernames[User][nameLenght] 什么的。 【参考方案1】:

只需按照以下方式使用std::vectorstd::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

【讨论】:

【参考方案2】:

如果您想要(或需要)保留您的 C 风格的不漂亮也不非常安全的代码,您可以编写

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

这将编译并且可能需要更多的努力,但您必须更正 usernames 大小并实际调用 compS

查看other answer 以获得更安全的 C++ 样式代码。

【讨论】:

这意味着如果用户键入"ad",那么它将匹配"admin",因为您将匹配限制为字符串的长度......不确定这是OP想要的,但如果不,最好使用strcmp 不带长度参数。 @m-m 没错,代码还有其他问题。我的回答主要是关于提出的问题(编译错误)。 @Ilya 是的,我自己也注意到了,如果你能建议一个主题来阅读它,你能否详细说明这个问题。抱歉,回复晚了。【参考方案3】:

有几种方法可以实现这一点。这是第一个想到的方法。

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(),因此我将您的数组更改为指向字符串的指针数组。数组末尾有一个空指针,让循环知道它何时到达末尾。

【讨论】:

以上是关于C++ 从 'char' 到 'const char' 的无效转换的主要内容,如果未能解决你的问题,请参考以下文章

将字符串 (const char*) 从 C++ 传递到 C# 时,SWIG_csharp_string_callback 会导致内存泄漏

从“const char*”到“unsigned char*”的无效转换

C++标准库 如何连接两个const char *类型字符串,并返回const char * 类型结果?

C ++没有从字符串到const char *的可行转换* [重复]

从 const char* 复制到字节数组 C++/c# interop Marshal::Copy

c++ 从 LPCTSTR 转换为 const char *