【问题标题】:There's too many initializers for char'[8]char'[8] 的初始化程序太多
【发布时间】:2022-01-12 00:27:42
【问题描述】:

我们被要求编写一个程序,使用二维数组列出 40 个学生姓名并将它们存储在学生记录数组中。

这是我目前的代码

#include<iostream>
using namespace std;
int
main ()
{
  cout << "\tStudent name";

  char name[5][8] = {
    {"Airah", "Ariya", "Arissa", "Althea", "Annika"},
    {"Alvin", "Adrielle", "Anthony", "Angelo", "Azriel"},
    {"Belle", "Camila", "Clara", "Elize", "Felicity"},
    {"Isabel", "Irish", "Kaila", "Kitchy","Kianna"},
    {"Lucas", "Miracle", "Natalia", "Primo", "Paris"},
    {"Rafael", "Ryan", "Rico", "Sky", "Serafine"},
    {"Samantha", "Scott", "Timothy", "Theo", "Tyron"},
    {"Winter", "Xyler", "Yohan", "Zachary", "Zhea"},

  }
  {
    for (i = 0; i < 40; i++)

      printf ("", name[i])}
      }

不幸的是,随后会显示一个错误,说明:

main.cpp:18:3: error: too many initializers for ‘char [8]’
   18 |   }
      |   ^

我该如何解决这个问题?谢谢!

【问题讨论】:

  • char 是一个字符,而不是整个字符串。所以你的整个name 只能存储 40 个不同的字符。也许您打算改用const char * name[5][8]
  • char name[5][8] -> std::vector&lt;std::string&gt;
  • 你应该将你的矩阵声明为static const,除非你打算修改它。这将帮助您的编译器使您的代码更高效。

标签: c++ arrays


【解决方案1】:

您为数组元素使用了错误的数据类型。您需要char char* 而不是char。您正在用字符串文字填充数组,这些文字是const char[] 数组,衰减const char* 指针。

此外,您的数组维度是向后的。您将数组声明为包含 5 个元素(char[8] 类型),但您试图用 8 个元素(const char*[5] 类型)填充它。

此外,您的printf() 语句实际上根本没有打印任何内容,因为它传递的是一个空格式字符串。你需要"%c" 来打印一个char,或者"%s" 来打印一个字符串。

此外,您的循环对于这种类型的数组是错误的。您不能使用一维索引来访问二维数组。您需要 2 个循环,每个维度一个。

试试这个:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
  cout << "\tStudent name";

  const char* name[8][5] = {
    {"Airah", "Ariya", "Arissa", "Althea", "Annika"},
    {"Alvin", "Adrielle", "Anthony", "Angelo", "Azriel"},
    {"Belle", "Camila", "Clara", "Elize", "Felicity"},
    {"Isabel", "Irish", "Kaila", "Kitchy","Kianna"},
    {"Lucas", "Miracle", "Natalia", "Primo", "Paris"},
    {"Rafael", "Ryan", "Rico", "Sky", "Serafine"},
    {"Samantha", "Scott", "Timothy", "Theo", "Tyron"},
    {"Winter", "Xyler", "Yohan", "Zachary", "Zhea"}
  };

  for (int i = 0; i < 8; i++) {
    for (int j = 0; j < 5; j++) {
      printf("%s ", name[i][j]);
      // or: cout << name[i][j] << ' ';
    }
    putchar('\n');
    // or: cout << '\n';
    // or: cout << endl;
  }
}

Online Demo

如果您必须使用一维索引,那么您必须做一些额外的数学运算才能将它们转换为二维索引:

#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
  cout << "\tStudent name";

  const char* name[8][5] = {
    {"Airah", "Ariya", "Arissa", "Althea", "Annika"},
    {"Alvin", "Adrielle", "Anthony", "Angelo", "Azriel"},
    {"Belle", "Camila", "Clara", "Elize", "Felicity"},
    {"Isabel", "Irish", "Kaila", "Kitchy","Kianna"},
    {"Lucas", "Miracle", "Natalia", "Primo", "Paris"},
    {"Rafael", "Ryan", "Rico", "Sky", "Serafine"},
    {"Samantha", "Scott", "Timothy", "Theo", "Tyron"},
    {"Winter", "Xyler", "Yohan", "Zachary", "Zhea"}
  };

  for (int i = 0; i < 40; i++) {
    printf("%s ", name[i / 5][i % 5]);
    // or: cout << name[i / 5][i % 5] << ' ';
    if (((i+1) % 5) == 0) {
      putchar('\n');
      // or: cout << '\n';
      // or: cout << endl;
    }
  }
}

Online Demo

【讨论】:

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