簡體   English   中英

字符分配數組不起作用

[英]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處的字符設置為該字符串,顯然不可行,因為:

  1. 您無法將8個字節放入1個字節的存儲桶中。
  2. 偏移量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.

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