【问题标题】:Too many initializers for char[9][9] [duplicate]char [9] [9]的初始化程序太多[重复]
【发布时间】:2012-01-31 11:25:42
【问题描述】:

但问题是,我声明的 char 数组中的初始值设定项的数量正是如此。

char dash[9][9]={
        {"1","2","3","4","5","6","7","8","9"},
        {"a","b","c","d","e","f","g","h","i"},
        {"q","w","e","r","t","y","u","i","o"},
        {"9","8","7","6","5","4","3","2","1"},
        {"i","h","g","f","e","d","c","b","a"},
        {"o","i","u","y","t","r","e","w","q"},
        {"z","x","y","w","v","u","t","s","r"},
        {"a","l","l","s","t","a","r","p","y"},
        {"m","o","n","d","o","l","o","r","i"}
    };

有九行九列。我的问题是什么?我检查了其他论坛和这个论坛的答案,但没有发现任何帮助。

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    从字符串(") 更改为字符,改用单引号(')

    char dash[9][9]={
            {'1','2','3','4','5','6','7','8','9'},
            {'a','b','c','d','e','f','g','h','i'},
            {'q','w','e','r','t','y','u','i','o'},
            {'9','8','7','6','5','4','3','2','1'},
            {'i','h','g','f','e','d','c','b','a'},
            {'o','i','u','y','t','r','e','w','q'},
            {'z','x','y','w','v','u','t','s','r'},
            {'a','l','l','s','t','a','r','p','y'},
            {'m','o','n','d','o','l','o','r','i'}
        };
    

    【讨论】:

      【解决方案2】:

      如果你使用双引号,它是这样完成的......

      char dash[9][9] =
      {
          "123456789",
          "abcdefghi",
          "qwertyuio",
          "987654321",
          "ihgfedcba",
          "oiuytrewq",
          "zxywvutsr",
          "allstarpy",
          "mondolori"
      };
      

      否则,请使用单引号。请注意,您可能会收到警告,例如

      error: initializer-string for array of chars is too long [-fpermissive]
      

      来自 G++ 4.6.2(编译器选项-Wall -Wextra)。

      【讨论】:

      • 谢谢乔纳森,我不应该试图缩短我的答案。
      • C 允许char[9] 数组使用长度正好为 9 的字符串字面量进行初始化;结果数组不是以空值结尾的(即,它不是字符串)。 C++ 不允许这样做,而 G++ 以外的编译器很可能完全拒绝该代码。 (此外,字符串文字之间需要逗号;否则,您实际上只有一个 81 个字符的文字。我将继续添加逗号。)
      【解决方案3】:

      你不应该使用单引号'而不是双引号"吗?

      【讨论】:

        【解决方案4】:

        将 char 更改为 char* 并保留双引号。当您想将其用作角色时,请将其作为角色回退。这样您就可以同时拥有字符和字符数组(字符串)。

        【讨论】:

        • 有趣的想法——改变声明器而不是初始化器。当然,当你想要 char 时,你不会投任何东西;你会取消引用数组中的char **dash[i][j] 甚至dash[i][j][0]?该解决方案将显着增加数组所需的存储空间,从 81 个字节增加到“81 个指针加上 81 个每个 2 字节的字符串”(存储空间的 6 倍或 10 倍,具体取决于您使用的是 32 位还是 64 位系统)。
        • 是的,我提出这个建议只是为了表明还有另一种操作数组的方法。但是,我当然同意在引入指针时会有额外的存储成本。
        • char* 转换为char 将为您提供一些实现定义的值,可能是内存地址的低位字节。这有什么用?
        【解决方案5】:

        改用单引号:

        char dash[9][9]={
            {'1','2','3','4','5','6','7','8','9'},
            {'a','b','c','d','e','f','g','h','i'},
            {'q','w','e','r','t','y','u','i','o'},
            {'9','8','7','6','5','4','3','2','1'},
            {'i','h','g','f','e','d','c','b','a'},
            {'o','i','u','y','t','r','e','w','q'},
            {'z','x','y','w','v','u','t','s','r'},
            {'a','l','l','s','t','a','r','p','y'},
            {'m','o','n','d','o','l','o','r','i'}
        };
        

        【讨论】:

          【解决方案6】:

          您正在使用字符串而不是字符初始化数组,因此每个元素都试图适应字符和空终止符。尝试“1”、“2”、“3”等。

          【讨论】:

            【解决方案7】:

            您需要将所有双引号 "" 更改为单引号 ''

            否则,它们是字符串而不是chars。

            在这种情况下,一个简单的查找和替换应该可以解决问题。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2022-01-12
              • 1970-01-01
              • 1970-01-01
              • 2019-11-04
              • 1970-01-01
              • 1970-01-01
              • 2014-03-22
              • 2014-02-04
              相关资源
              最近更新 更多