2015-04-12 43 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