我正在尝试编写一个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 *
答案 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.你的问题有两种解决方法:
如果一个函数需要修改一个字符串,它必须是char *
类型,所以这意味着你需要传递一个可修改的字符串,而不是字符串文字。这可以通过创建一个数组来实现:
char buf [1000] =“String literal”; 功能(buf,sizeof buf,...);
如果函数不需要修改字符串(例如在你的情况下),你可以[且应该]让你的函数只接受const char *
。这样,可修改和不可修改的字符串都可以毫无问题地传递给您的函数。
function(const char *arg, ...);
// somewhere else:
function("Acceptable", 1, 2, 3);
char buf[20] = "Also acceptable!";
function(buf, 1, 2, 3);