2012-04-21 158 views
2

我有兩個關於char數組的問題。C++ - char數組和空字符

  1. 從代碼波紋管,因爲arrconst,爲什麼不編譯器給我一個錯誤,因爲我重寫呢?

    char arr[5]; // arr is a const pointer to (*)[5] array 
    cin>>arr; // 
    
  2. 當我初始化字符數組是這樣的:

    char arr[5]={'h','i'}; 
    

    ,如果我這樣做:

    cout << arr << "something here \n"; 
    

    它將打印hisomething here。我以爲它應該打印出來

    hi something here 
    

    與3 witespaces。

    但如果我這樣做:

    for(int i = 0; i < 5; i++){ 
        cout << arr[i]; 
    } 
    

    打印出3個空格。

第二種情況似乎證明編譯器不會添加任何空字符。那麼編譯器如何忽略這3個空格呢?

回答

8
  1. 此數組不是const,因爲沒有const限定符。
  2. 如果您沒有在初始化程序列表中指定剩餘值,則它們將被初始化爲00用於終止C字符串,而不是空白字符。

至於你的說法,那for(int i=0;i<5;i++){ cout << arr[i]; }打印空白 - 你是怎麼檢查的?

對於我來說:

#include <iostream> 

int main(){ 
    char arr[5]={'h','i'}; 
    for(int i=0;i<5;i++){ std::cout << arr[i]; } 
    std::cout << "X" << std::endl; 
} 

打印:

hiX 

和hexdumped:

$ ./t | hexdump -Cv 
00000000 68 69 00 00 00 58 0a        |hi...X.| 
00000007 

'\0'字符打印。他們的顯示器似乎依賴於操作系統。但他們不是空白的。

+0

如果他們將初始化爲0,那麼爲什麼在第二個代碼中,他們被視爲空白? – AlexDan 2012-04-21 08:23:37

+1

你爲什麼認爲他們被視爲空白?嘗試將輸出重定向到文本文件,然後使用十六進制編輯器檢查。 – 2012-04-21 08:26:00

+0

我複製了你的代碼,它打印你喜歡X,而不是hiX。 – AlexDan 2012-04-21 08:26:27

0

arr會執行一個常量指針,這意味着您不能將指針設置爲另一個地址。它不是一個指向const的指針,所以你可以改變指針指向的地址處的數據。

實施例:

arr=&another_variable; //Illegal 
*arr='A';    //Legal 
+0

是的,我知道,但例如CIN >> ARR;我輸入「cpp」。編譯器會如何處理它1)arr =「cpp」或像這樣2)arr [0] ='c',arr [1] ='p',arr [2] ='p'。 – AlexDan 2012-04-21 08:30:05

+0

它會像這樣對待它:arr [0] ='c',arr [1] ='p',arr [2] ='p' – user877329 2012-04-22 10:42:25

3
  1. ARR本身是一個 「炭[5]」 而不是 「常量字符(*)[5]」。當你寫cin >> arr時,它被隱含地轉換爲「char *」右值。這不是一個常量,因爲它甚至不是一個左值。

而「const char *」或「char const *」表示指定的左值不能改變,而「char * const」表示指針左值本身不能改變。但是,這與你的問題無關,儘管如此。

  1. 首先,沒有空白。它是cin附加空字符。

陣列僅僅是一個數組:

char a[5]; //a's type is char[5]; 

但是陣列難言的操作數。我只記得接受數組類型的操作符是sizeof和&(address-of)(另一方面,這意味着有時必須是一個數組,否則如果你寫了sizeof(a),它會給你的大小的指針。)。對於其他操作,a被轉換爲char * rvalue。是的,甚至當你寫一個[0],一個[1]等等時,a [0]等價於*(a + 0),它操作指針而不是數組。

當你不能分配到的東西,它並不總是意味着就是「常量」:

  1. 您不能分配到當然一個const變量。
  2. 你只能分配給一個變量(或稱左值),所以你不能指定一個右值(或aka值)。所以你不能寫1 = 2,因爲1是一個右值而不是變量,不是因爲1是「const」。
  3. 您必須將某些內容分配給與其類型匹配的變量。所以如果你有一個const char * p和一個char * q,你不能寫q = p。他們的類型不匹配。而且,這並不意味着q是常量,因爲它顯然不是。但是你可以寫p = q,因爲char *可以隱式轉換爲const char *。但是const char *必須明確地轉換爲char *。
+0

arr是一個常量指針,所以你不能這樣做arr =「something」 。但你說你可以做這個cin >> arr;例如我有cin >> arr;我輸入「cpp」;這是否會被arr [0] ='c',arr [1] ='p',arr [2] ='p'替換; – AlexDan 2012-04-21 08:40:33

+1

你不能寫arr =「」,因爲arr是一個不是指針的數組。即使隱含地轉換爲指針,arr也是指向右值的指針,無法賦值。 「cpp」部分:不,你錯過了arr [3] ='\ 0'; – BlueWanderer 2012-04-21 08:45:37

+0

關於const指針的事情:如果arr是一個const char *,那麼你將無法寫入char * x = arr,但實際上你可以。 – BlueWanderer 2012-04-21 08:47:49

0
  1. 第一個它不是const。第二,這個代碼是不安全的。
  2. 你應該在最後設置終止符號'\ 0'。

你不應該使用字符類型,嘗試使用字符串,而不是字符數組。