C,IRC BOT。警告:不推荐将字符串常量转换为char *

时间:2012-08-09 01:04:35

标签: c compiler-errors char

我正在尝试编写一个IRC机器人。机器人连接到服务器,但是我无法加入它。

int conn;
char sbuf[512];

// Function I'm trying to use
void join(char *fmt, ...){
    va_list ap;
    va_start(ap,fmt);
    vsnprintf(sbuf,512, fmt,ap);
    va_end(ap);

    printf("<< %s",sbuf);
    write(conn,sbuf,strlen(sbuff));
}

// in main function 
int main(){
    const char * chanm = "test";

    // Here is where I get my error, line 38
    join("JOIN %s\r\n", chanm);
}

有人可以告诉我,我做错了什么吗?

我收到错误消息: ircbot.c:38警告:不推荐将字符串常量转换为char *

3 个答案:

答案 0 :(得分:3)

将您的职能标题更改为:

void join(const char *fmt, ...){

问题是"JOIN %s\r\n"常量字符串,并且您尝试将其传递给非常量char *。由于您不打算在fmt函数中修改join,因此应将其声明为const char *fmt

答案 1 :(得分:1)

您可以使用以下方法解决此问题:

void join(const char *fmt, ...)
//        ^^^^^

答案 2 :(得分:0)

在C中,字符串文字具有非const类型,即使它是未定义的行为以尝试修改字符串文字的内容。例如,在C中这是不允许,即使允许编译器编译它而不发出警告或错误:

    char *str = "Hello World!";
    str[4] = 'x'; // undefined behaviour

在上文中,字符串文字"Hello World!"的类型为char[13]。为了防止意外修改字符串文字,一些编译器将字符串文字视为const char[]类型。它能做的最多就是发出诊断/警告,因为从技术上讲它仍然有效C.你的问题有两种解决方法:

  1. 如果一个函数需要修改一个字符串,它必须是char *类型,所以这意味着你需要传递一个可修改的字符串,而不是字符串文字。这可以通过创建一个数组来实现:

    char buf [1000] =“String literal”; 功能(buf,sizeof buf,...);

  2. 如果函数不需要修改字符串(例如在你的情况下),你可以[且应该]让你的函数只接受const char *。这样,可修改和不可修改的字符串都可以毫无问题地传递给您的函数。

    function(const char *arg, ...);
    
    // somewhere else:
    
    function("Acceptable", 1, 2, 3);
    
    char buf[20] = "Also acceptable!";
    function(buf, 1, 2, 3);