![](/img/trans.png)
[英]error C2440: '=' : cannot convert from 'const char [2]' to 'char'
[英]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.