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' to
const 的无效转换
关于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::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";
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 *的可行转换* [重复]