簡體   English   中英

對使用的strcpy函數的懷疑

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM