2015-04-12 111 views
0

我試圖寫一個簡單的名稱生成器,但我卡住了數組初始化。如何初始化字符的二維數組

  1. 爲什麼我不能像這樣初始化二維數組?

    const char* alphab[2][26] ={{"ABCDEFGHIJKLMNOPQRSTUVWXYZ"}, 
    {"abcdefghijklmnopqrstuvwxyz"}}; 
    

它編譯沒有錯誤和警告,但cout << alphab[0][5]打印什麼。

  • 爲什麼這

    class Sample{ 
        private: 
        char alphnum[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 
    } 
    
  • 拋出 「初始化串爲字符的陣列太長」 的錯誤,並且該

    char alphnum[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; 
    class Sample{ 
    //code 
    }; 
    

    不?

    這裏是我的代碼

    class NameGen { 
    
    private: 
        string str; 
        char arr[5]; 
        const char* alphab[2][26] = {{"ABCDEFGHIJKLMNOPQRSTUVWXYZ"}, 
         {"abcdefghijklmnopqrstuvwxyz"} 
        }; 
    
    public: 
        string genName() 
        { 
         srand(time(0)); 
         for (unsigned int i = 0; i < sizeof(arr); ++i) { 
          arr[i] = *alphab[(i > 0) ? 1 : 0][rand() % 25]; 
         } 
         str = arr; 
         return str; 
        } 
    } alph; 
    
    int main() 
    { 
        cout << alph.genName() << endl; 
        return 0; 
    } 
    

    沒有警告和錯誤。輸出是:分割故障(代碼轉儲)

    +0

    請記住,文字字符串「ABCDEFGHIJKLMNOPQRSTUVWXYZ」包含* 27 *字符,包括終止的''\ 0'。 –

    +0

    @JoachimPileborg仍然不能正常工作 – Pocsss

    +0

    '「ABCDEFGHIJKLMNOPQRSTUVWXYZ」'是'alphab [0] [0]'。 'alphab [0]'的所有其他元素都是空指針,並且對它們進行解引用是錯誤的。 – molbdnilo

    回答

    2

    答案爲1

    const char* alphab[2][26] ={{"ABCDEFGHIJKLMNOPQRSTUVWXYZ"}, 
              {"abcdefghijklmnopqrstuvwxyz"}}; 
    

    應該是

    const char* alphab[2] ={{"ABCDEFGHIJKLMNOPQRSTUVWXYZ"}, 
             {"abcdefghijklmnopqrstuvwxyz"}}; 
    

    因爲你沒有指示器的2-d陣列到字符但只是一個指向字符的一維數組。然後,將線

    arr[i] = *alphab[(i>0) ? 1: 0][rand() % 25]; 
    

    應改爲

    arr[i] = alphab[(i>0) ? 1: 0][rand() % 25]; 
    

    活生生的例子here

    答案2.

    計數的字符數,並添加了\0字符的多餘的。你不能有一個零大小的數組作爲成員變量,所以必須指定長度,像

    char alphnum[5] = "test"; 
    
    +0

    1.現在起作用了。但它也使我感覺0:\ 當我像這樣引用它時,它怎麼可能不是一個2D數組:alphab [(i> 0))? 1:0] [rand()%25]。如果這是一維數組,它不應該是這樣的:alphab [(i> 0)? 1:0]? 2.我很好奇爲什麼當它在NameGen類的外部定義時,我無法在[]中寫任何內容,並且在類中定義時無法執行。 – Pocsss

    +0

    @Pocsss它是*指針*的一維數組。當你編寫'alphab [0]'時,你會得到第一個指向字符串文字'「ABC ...」的指針,然後通過'[]'運算符來尋址(記住你可以使用數組訪問指針存儲器類語法,而不是寫'*(p + 5)'可以寫'p [5]')。關於第二個問題,我不確定委員會爲什麼決定,但這是規則。 – vsoftco

    +0

    現在它是有道理的。謝謝:) – Pocsss

    0

    試試這個:

    char alphab[2][27] = { 
        {"abcdefghijklmnopqrstuvwxyz"}, 
        {"ABCDEFGHIJKLMNOPQRSTUVWXYZ"} 
    }; 
    

    注意使用炭和炭的*。 char *可以自制一組字符! 爲\ n留下額外的單位。

    您現在可以輕鬆引用alphab。

    Cout<< alphab[1][5] ; //you will get 'F' 
    
    +0

    你需要把'''無處不在,比如''a','b''等等,這有點痛苦 – vsoftco

    +0

    老兄! :D沒有區別!例如:char ** alpab;那麼他可以初始化數組。或者他可以從頭開始將其定義爲char alphab [] []! –

    +0

    然後嘗試編譯[this one](http://ideone.com/OUqYPj) – vsoftco