1

我正在尝试编写一个 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 warning: deprecated conversion from string constant to char*

4

3 回答 3

3

将您的函数标题更改为:

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

问题是它"JOIN %s\r\n"是一个常量字符串,而您试图将它传递给一个非常量char *。由于您不打算fmtjoin函数中进行修改,因此应将其声明为const char *fmt.

于 2012-08-09T01:06:31.113 回答
1

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

void join(const char *fmt, ...)
//        ^^^^^
于 2012-08-09T01:06:43.523 回答
0

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

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

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

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

    char buf[1000] = "字符串字面量"; 函数(缓冲区,缓冲区大小,...);

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

    function(const char *arg, ...);
    
    // somewhere else:
    
    function("Acceptable", 1, 2, 3);
    
    char buf[20] = "Also acceptable!";
    function(buf, 1, 2, 3);
    
于 2012-08-09T01:20:59.807 回答