[英]QString to std::string to const char* conversion does not work in assignment
[英]array of char assignment does not work
我正在嘗試在switch語句中更改我的char數組[10]的值,這樣,如果我們有情況1,我的char數組[10] =“ january”,或者如果我們有情況2,則array [10] =“ february”,依此類推。 問題是我收到錯誤消息,並且我知道我做錯了什么。 任何幫助將不勝感激。 這是我用Dev-C ++編寫的switch語句。
char month[10];
switch (i)
{
case 1:
month[10]="January";
cout<<month<<endl;
break;
case 2:
month[10]="February";
cout<<month<<endl;
break;
}
您不能像這樣分配char
數組,需要使用strcpy
。
或者更好的方法是使用std::string
,這是C ++要做的事情。
std::string month;
switch (i)
{
case 1:
month="January";
cout<<month<<endl;
break;
case 2:
month="February";
cout<<month<<endl;
break;
}
或者,如果您必須堅持使用char[]
:
char month[10];
switch (i)
{
case 1:
strcpy(month,"January");
cout<<month<<endl;
break;
case 2:
strcpy(month,"February");
cout<<month<<endl;
break;
}
出現錯誤的原因是month[10]
是一個char
,並且您試圖為其分配一個const char*
,這是非法的。 (實際上,這是未定義的行為,因為10超出了數組的長度)。
要快速修復,請替換:
month[10] = "January";
與:
strcpy (month, "January");
或類似strncpy
的等效項,如果您是無法弄清其緩沖區應該多大的類型之一-最長的月份“ September”將很高興地容納十個字節:-)
前一段代碼正在做的是嘗試將數組偏移量10處的字符設置為該字符串,顯然不可行,因為:
當然,在代碼中不占用太多行的替代方法可能是:
static char *months[] = { "January", "February", ..., "December" };
if ((i < 1) or (i > 12))
strcpy (month, "?");
else
strcpy (month, months[i-1]);
cout << month << endl;
為了獲得正確的解決方案,請停止在C ++代碼中使用C樣式的字符串。 C ++的設計人員投入了大量精力來提供std::string
,這樣您就不會遇到這樣的問題。
您不能將字符串文字分配給數組。 您必須改為使用strcpy()
。
另一種方法是使用std::string
代替char
數組。
當您創建"January"
或"December"
之類的字符串時,編譯器將生成一個const char *
,該const char *
指向一個常量字符數組,該數組的末尾為0
,而不是character 。
您的代碼正在嘗試將"January"
的地址分配給數組中的第11個元素,因為數組從0開始,所以它沒有此地址。
這有兩個問題,首先, month[]
的元素是字符,而不是字符指針。 其次,數組從0開始,因此您希望使用month[9]
,盡管那仍然是錯誤的。
您要執行的操作是將每個字符復制到數組中,有些函數可以執行此操作,例如strcpy
但請先使用for
循環進行嘗試,以使自己對正在發生的事情有更好的了解。
解決此問題的另一種方法(可能是您要遵循的方法)是將month
從固定大小的字符數組更改為char *
,這樣您便可以使用更早的month = "January"
方法了,我更喜歡自己做,因為它只使用我需要的內存,並且語法更簡潔,盡管您應該知道如何使用這兩種方法。
盡管它更像是一種風格上的注釋,但是如果您在專用功能中使用它,可以大大改善switch的用法:
// Using C-string
char const* selectMonth(int i) {
switch(i) {
case 1: return "January";
case 2: return "February";
...
}
assert(0 && "This is impossible!");
}
然后,您可以輕松地使用它:
char month[10];
strcpy(month, selectMonth(i));
通常,您應該發現使用小的功能有助於使代碼更具可讀性。 在真正的C ++風格中,您甚至可以獲得const-ness的好處:
std::string const month = selectMonth(i); // note: the very same selectMonth!
~~~~~
此const
可以確保您以后不會意外修改變量,只有在可以立即對其進行初始化的情況下它才起作用,這需要一個小的函數來完成。 善良會帶來善良:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.