【问题标题】:C, IRC BOT. warning: deprecated conversion from string constant to char*C、IRC 机器人。警告:不推荐将字符串常量转换为 char*
【发布时间】:2012-08-09 01:04:34
【问题描述】:

我正在尝试编写一个 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*

【问题讨论】:

    标签: c compiler-errors char


    【解决方案1】:

    将函数标题更改为:

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

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

    【讨论】:

      【解决方案2】:

      您可以通过以下方式解决此问题:

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

      【讨论】:

        【解决方案3】:

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

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

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

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

          char buf[1000] = "字符串字面量"; function(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);
          

        【讨论】:

          猜你喜欢
          • 2011-11-20
          • 2012-09-09
          • 1970-01-01
          • 2021-07-02
          • 2010-12-04
          • 1970-01-01
          • 1970-01-01
          • 2014-04-30
          • 1970-01-01
          相关资源
          最近更新 更多