[英]Doubts in the strcpy function used
我使用的兩個緩沖區都是unsigned char
,當我使用函數strcpy
,出現編譯錯誤,提示“無符號字符*到字符*的無效轉換”。 誰能告訴我,無符號緩沖區與帶符號緩沖區對輸出有什么區別? 這是我嘗試過的程序。
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 *的類型轉換是否會產生任何問題?
請讓我知道是否需要更多輸入。
您可以更改:
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*
,當調用函數時會進行參數類型檢查,編譯器會發現您未使用正確的類型參數調用該函數,因此它會抱怨,當您應用強制類型轉換時函數參數匹配,因此編譯通過。
在字符串函數中 對char 進行 類型轉換是否會 產生任何問題?*
不,在這種情況下不是。
盡管由於答案中上面提到的原因而更改unsigned char
的用法更為合理。
建議:
Strcpy
是不安全的,因此最好使用strncpy
,它允許您明確指定要復制的字符數,而不是依賴源字符串的空終止符。這也有助於避免緩沖區溢出,因為您明確指定了長度。
您使用它的方式應該沒問題。
但是,您不應將unsigned char
數組與字符串處理函數一起使用。 在C中,字符串是char數組,而不是無符號char數組。 由於傳遞給strcpy
會丟棄unsigned
限定符,因此編譯器會發出警告。
通常,不要在沒有必要的情況下將內容簽名。
strcpy
想要簡單簡單的char *
。 將緩沖區強制轉換為char *
,這樣就可以了。 然后首先使用strcpy
存在整個安全問題...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.