我正在使用两个unsigned char
的缓冲区,当我使用函数strcpy
时,有一个编译错误,上面写着“将unsigned char *无效转换为char *”。任何人都可以告诉我,无符号缓冲区与带符号缓冲区对输出有什么区别?这是我尝试的程序。
main()
{
unsigned char buff[20] = "Michael";
unsigned char dst[20] = "Jackson";
strcpy(buff,dst);
printf("The string is %s\n",buff);
}
现在当我将strcpy中传递的参数类型转换为(char *)时,这个程序工作正常,如下所示
main()
{
unsigned char buff[20] = "Michael";
unsigned char dst[20] = "Jackson";
strcpy((char *)buff,(char *)dst);
printf("The string is %s\n",buff);
}
第二个问题:在字符串函数中对char *进行类型转换会产生任何问题吗?
如果您需要更多输入,请告诉我。
答案 0 :(得分:6)
你可以改变:
unsigned char buff[20] = "Michael";
unsigned char dst[20] = "Jackson";
到
char buff[20] = "Michael";
char dst[20] = "Jackson";
从逻辑上考虑它,一个字符串不能被签名或无符号,它不是一个被处理的数值,它只是一个char数组,你应该声明并使用它。
为什么会收到错误?
strcpy
有原型:
char *strcpy(char *restrict s1, const char *restrict s2);
你传递给它的是unsigned char*
,当一个函数被调用时,参数类型检查发生并且编译器发现你没有使用正确的类型参数调用函数,因此它会抱怨它,当你应用强制转换时,函数参数匹配,因此编译传递。
在字符串函数中对字符串进行类型转换 会产生任何问题吗?*
不,在这种情况下它没有。
虽然在答案中出于上述原因更改unsigned char
的使用情况更有意义。
<强>建议:强>
Strcpy
不安全,所以你最好使用strncpy
,它允许你明确指定要复制的字符数,而不是依赖源字符串的null终止符。这也有助于避免缓冲溢出,因为你明确指定了一个长度。
答案 1 :(得分:5)
你使用它的方式应该没问题。
但是你不应该使用unsigned char
数组和字符串处理函数。在C字符串中是char数组,而不是unsigned char数组。由于传递给strcpy
会丢弃unsigned
限定符,编译器会发出警告。
作为一般规则,不要在没有签名的情况下进行无符号处理。
答案 2 :(得分:0)
strcpy
想要char *
,简单明了。将缓冲区转换为char *
,你会没事的。然后首先使用strcpy
就存在整个安全问题......