2013-02-16 81 views
11

我沒有得到任何錯誤,當我鍵入將價值分配到字符數組

char a[10] = "Hi"; 

但是,當我將其更改爲以下,我得到一個錯誤:Array type char is not assignable.

char a[10]; 
a = "Hi"; 

爲什麼數組類型char不分配?是因爲語言是故意寫的,還是我錯過了一個觀點?

+0

對於響應的:由於這是標記C++,是在處理'char []'的時候有一個*非* -strcpy「更多的C++」方法來做到這一點? – 2013-02-16 22:56:14

+0

「更多的C++方式」是使用字符串或矢量而不是char []。通過使用char [],你基本上接受了與之相關的所有C-ness。 – Cogwheel 2013-02-16 23:07:54

+0

感謝您的回覆傢伙。 – 2013-02-16 23:15:40

回答

12

這樣做,正如我上面註釋的C++的方式,是使用std::string而不是char[]。這會給你你期望的任務行爲。

也就是說,你只能得到一個錯誤的第二種情況的原因是,在這兩條線的=意味着不同的事情:

char a[10] = "Hi"; 
a = "Hi"; 

首先是初始化,第二個是一個賦值。

第一行在堆棧上分配足夠的空間以容納10個字符,並將這些字符的前三個字符初始化爲'H','i'和'\ 0'。從這一點開始,所有a確實指的是數組在棧上的位置。由於陣列只是堆棧中的一個地方,因此決不允許更改a。如果你想在棧上的不同位置保存不同的值,你需要一個不同的變量。

另一方面,第二條(無效)行嘗試更改a以引用(技術上不同)"Hi"的咒語。由於上述原因,這是不允許的。一旦你有一個初始化數組,你可以用它做的唯一事情就是從它讀取數值併爲其寫入數值。您無法更改其位置或大小。這是一個任務在這種情況下會嘗試做的事情。

+1

你介意包括你可以使用' std :: string'並得到OP想要的行爲?我認爲這將是一個很好的答案。 – NathanOliver 2016-03-11 16:25:45

+1

是的,我通常會嘗試給出兩層答案,像這樣的問題(一個是直接的,另一個是猜測意圖)。既然提問者已經看到我的評論,並且這個線程被關閉爲愚蠢,我想我沒有打擾。 – Cogwheel 2016-03-11 17:29:28

2

a是指向數組的指針,而不是數組本身。它不能被重新分配。

您使用C++ BTW標記了。對於這種情況,最好使用std :: string。這可能更多你所期望的。

+1

'a'是數組本身,而不是指向數組的指針。它*可以*被隱式轉換爲指向第一個元素的指針。 – 2013-02-16 22:48:18

8

該語言不允許將字符串文字分配給字符數組。您應該使用strcpy()代替:

strcpy(a, "Hi"); 
+1

正確 - 對於這種情況,你應該使用'strcpy'。忘記你甚至聽說過'strncpy'可能根本不會有什麼損失 - 它幾乎和'gets'一樣沒用。 – 2013-02-17 00:37:21

+0

相關['strcpy'和'strcpy_s'之間的區別?](http://stackoverflow.com/questions/32136185/difference-between-strcpy-and-strcpy-s) – 2017-03-03 05:45:03

16

數組是不是一個修改的左值

使用

char a[10]; 
strcpy(a, "Hi"); 
0

簡單的來說,

char a[10] = "Hi"; 

是一點 「額外功能」,因爲在運行時不能這樣做。

但這就是C/C++標準庫的原因。

#include <string.h> 

// ... 
strcpy(a,"Test"); // STR-ing C-o-PY. 

這來自C的標準庫。如果使用C++,你應該使用std :: string,除非你真的想從你的目標PC中獲取所有可能的性能。

0

這是因爲初始化不是一個賦值。第一件作品是一個初始化,第二件作品並不像預期的那樣工作。你只是不能將值分配給你應該使用的數組......像strcpymemcpy。或者您也可以使用std::copy<algorithm>

-2

它很簡單,(=)有兩個不同的平均賦值和初始化。你也可以寫你的代碼一樣,

  #include <iostream> 

     using namespace std; 

      int main() 
     { 
      char message[3] = {'H', 'i', '\0'}; 

       cout << message<< endl; 

      return 0; 

      } 

在此代碼,你有沒有需要編寫一個困難的代碼或功能,甚至無需string.h中