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()
解释一下这三个函数

class Month              

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' 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++关于const char*的问题的主要内容,如果未能解决你的问题,请参考以下文章

c++错误:从不兼容的类型'const char *'分配给'char *'

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

const char* 与 char* (C++)

C++ 函数形参里的const char作为返回值问题

C++ 将 char 转换为 const char*

c++ 从 LPCTSTR 转换为 const char *