c++关于const char*的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++关于const char*的问题相关的知识,希望对你有一定的参考价值。
class Month
public:
Month();
Month(char,char,char);
Month(int);
int input(int );
int input(const char*); 这个地方是什么意思?
const char* output(); 这个地方是什么意思?
Month next();
private:
int month;
int ctoi(const char *);
;
int Month::ctoi(const char *arr)
int Month::input(const char *arr)
const char * Month::output()
解释一下这三个函数
public:
Month(); //默认构造函数
Month(char,char,char); //带参数的构造函数
Month(int); //带int参数的构造函数
int input(int ); //输入函数,用于直接输入整型的月份号
int input(const char*); //月份可以输入字符啊,比如三月,它应该有个转换,将其转成整数
const char* output(); //返回值带const就表示返回值只读,这个一般没有太大作用的
Month next(); //这个需要看源码啦
private:
int month;
int ctoi(const char *); //转换函数,用于整型转字符,或者字符转整型
;
int Month::ctoi(const char *arr)
int Month::input(const char *arr)
const char * Month::output()追问
能在解释一下最下面的那三个函数吗,谢谢
追答数据成员函函数啊,穿了们都是类中的成员函数,不用在解释啦。
参考技术A int Month::ctoi/input(const char *arr):接受一个 c-style 字符串常量(即指向字符数组首元素的指针)const char * Month::output():返回一个字符串常量
C++ 从 'char' 到 'const char' 的无效转换
【中文标题】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++关于const char*的问题的主要内容,如果未能解决你的问题,请参考以下文章
c++错误:从不兼容的类型'const char *'分配给'char *'