簡體   English   中英

錯誤C2440:'=':無法從'char [5]'轉換為'char [20]'

[英]error C2440: '=' : cannot convert from 'char [5]' to 'char [20]'

這與我以前的帖子有關

我創建了一個Struct:

struct buffer
{
    char ProjectName[20];
       char ProjectID[20];
};

現在,當我嘗試為其分配值時:

buffer buf;
buf.ProjectID = "3174";
buf.ProjectName = "NDS";

我收到此錯誤:

error C2440: '=' : cannot convert from 'char [5]' to 'char [20]'

並解決這個問題我嘗試減少結構的大小,如下所示(不能這樣做):

struct buffer
{

    char ProjectName[4];
    char ProjectID[5];
};

和獲取error C2106: '=' : left operand must be l-value

您必須將字符串復制到數組中:

strcpy(buf.ProjectName, "3174");

注意要復制到數組中的字符串的長度

你不能在C ++中分配這樣的字符串。 您需要使用strcpy等函數來復制字符串。 或者更好的是仍然使用類std::string

這是正常的,你無法真正為char表分配值(有很多不同的解決方案,例如sprintf或strcpy)。 但這是一個C問題,而不是C ++。

由於您使用C ++進行編碼,因此您應該使用std :: string來管理字符串(如果需要在char表中轉換的字符串,則使用c_str()方法)。

讓我們看看第一種情況:

buffer buf; 
buf.ProjectID = "3174"; 
buf.ProjectName = "NDS"; 

$ 2.13.4 / 1 - “普通字符串文字具有類型”n const char“和靜態存儲持續時間(3.7)”

"3174"的類型是char const [5] ,“NDS”的類型是char const [4] 在嘗試分配'buf.ProjectID' ,編譯器必須基本上從'char const [5]''char const [20]' C ++規則不允許這種轉換。 實際上,在您的下一次嘗試中會拋出更合適的錯誤消息。

$ 8.3.4 / 5 - '[注意:影響數組類型左值的轉換在4.2中描述。 無法修改數組類型的對象,請參見3.10。 ]”。

換句話說,這意味着,數組的名稱是不可修改的左值(這是第二個編譯器消息所說的)。

$ 5.17-“有幾個賦值運算符,所有賦值運算符都是從右到左分組。所有賦值都需要一個可修改的左值作為左操作數,賦值表達式的類型是左操作數的類型。”

所以這是摘要:

要使賦值表達式起作用,左側應該是可修改的LValue表達式。 但是,數組是不可修改的Lvalue表達式。 因此無法分配。

我很遺憾地說C ++在這里有點不直觀。 你可以說:

char name[10] = "abcd";

並且,鑒於您的上述定義:

buffer buf = { "NDS", "3174" };

后者依賴於結構中的字段與列表中的值之間的一對一對應關系,因此我不得不顛倒您的分配中使用的順序。

但是,你不能做你的

buf.ProjectName = "abcde";

在C ++中實際請求的是buf.ProjectName加載了一個指向包含字符數據“abcde”的內存的指針。 但是你不能這樣做,因為ProjectName本身是字符數據的另一個緩沖區,而不是指向字符數據的指針。

因此,當您的源和目標區域包含NUL終止的字符串(必要時為Google ASCIIZ)時,您需要使用支持函數從一個復制到另一個:

strcpy(buf.ProjectName, "name");

如果ProjectName的維度太小,那么您的字符串可能會覆蓋編譯器未為ProjectName保留的內存,可能導致崩潰或錯誤輸出。 您可以防止這種情況 - 如果字符串的相對大小顯然不正確 - 使用strncpy(buf.ProjectName, "name", sizeof buf.ProjectName) 不幸的是,這意味着buf.ProjectName可能無法保持完整的預期值,因此使用起來可疑。

C ++改進了這種處理文本數據的方式 - 它繼承自C - 與std :: string類。 你可以這么簡單:

#include <string>
struct Buffer
{
    std::string project_name_;
    std::string project_id_;
};
Buffer b;
b.project_name_ = "abcde"; // works with string literals.
b.project_id_ = b.project_name_;  // can copy from std::string to std::string

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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