以下是简单的代码:
unsigned char buf[255];
unsigned char msg[255];
while((res = read (fd, buf, (sizeof buf)-1)) > 0)
{
buf[res] = '\0';
strcat(msg, buf);
length += res;
if(length >= 10)
break;
}
这一行strcat(msg, buf);
给出了以下警告:
warning: pointer targets in passing argument 1 of ‘strcat’ differ in signedness
我已经尝试了针对类似问题找到的所有解决方案,但没有多大帮助。当两个变量具有相同的符号时,任何人都可以帮助解释为什么这会给出错误。我该如何删除它。感谢
编辑:
unsigned const char *buf[255];
unsigned char *msg[255];
strcat(msg, buf);
现在它发出警告:
warning: passing argument 2 of ‘strcat’ from incompatible pointer type
答案 0 :(得分:0)
将我的comment扩展为类似答案的内容。
strcat()
函数需要普通字符*:
char *strcpy(char * restrict s1, const char * restrict s2);
你正在通过unsigned char *
。这些是不同的类型(即使普通char
是无符号类型)。 str*()
函数不是为了获取unsigned char
的数组而设计的。要“安抚”(或“胁迫”)编译器接受调用,您需要转换指针:
strcat((char *)msg, (char *)buf);
或者编写并使用一系列自动执行此操作的功能:
static inline unsigned char *ustrcat(unsigned char *dst, const unsigned char *src)
{
return (unsigned char *)strcat((char *)dst, (char *)src);
}
如果您需要经常使用这些功能,这可能是一个好主意;这意味着你不必在你的代码周围留下这么多难看的演员阵容。如果您愿意,可以添加restrict
限定符。
请注意,char
,unsigned char
和signed char
这三种类型是截然不同的,即使普通char
具有与其他两种值相同的值范围。 ISO / IEC 9899:2011§6.2.5类型说:
¶15统称为
char
,signed char
和unsigned char
三种类型 字符类型。实现应将char
定义为具有相同的范围, 表示和行为为signed char
或unsigned char
。 45)CHAR_MIN
中定义的45)
<limits.h>
将具有值0
或SCHAR_MIN
中的一个,这可以是 用来区分这两个选项。无论做出何种选择,char
都是一个独立的类型 另外两个并且与两者都不兼容。
您的代码容易受到缓冲区溢出的影响,因为您没有在任何地方检查长度。这与您获得的编译警告相关,但您应该确保不要将太多数据复制到目标缓冲区中。
您还尝试过:
unsigned const char *buf[255];
unsigned char *msg[255];
strcat(msg, buf);
现在你传递的指针指向一个只需要指向char
的函数的指针 - 编译器是抱怨的。