c++ - Char 数组指针和 "error: too many initializers for ' char [ ]'"

标签 c++

下面的一段代码给出了错误:“'char []' 的初始值设定项太多”:

int main()
{
    int input;
    char numbers[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

    std::cin >> input;

    std::cout << ((input > 9) ? "Greater than 9" : numbers[input-1]) << std::endl;
}

这个工作需要的是 numbers 是一个指针变量,即:

char * numbers[] = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};

我是 C++ 的新手,我想了解为什么这个数组需要是一个指针,以及内存中到底发生了什么需要它是一个指针?

在 Java 等其他语言中,您可以执行以下操作:

import java.util.Scanner;

public class Playground
{
    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);
        int input = scanner.nextInt();

        String[] numbers = {"one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
        System.out.println((input > 9) ? "Greater than 9" : numbers[input-1]);
    }
}

这里不需要指针,据我所知,在这种情况下也不需要它们。

最佳答案

因为字符串是字面值,即常量,你应该这样声明数组:

const char* numbers[] = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

这是在编译时定义数组的 C 方法。所以数组需要的内存是编译器计算出来的。因此,您必须将其声明为 const char* 数组,即内容不能更改,因为它是在编译时定义的。

你可以这样声明数组:

char numbers[9][6] = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

它所做的是声明一个包含 9 个元素的二维数组,每个元素包含 6 个字符。所以现在您可以根据需要在运行时更改每个单词的值。方括号 [] 让一切变得不同。当您使用 char*[] 时,编译器会将元素视为文字。

如果事先不知道数组中每个单词的大小,则必须在堆上分配它们。

C++ 方法是使用 std:string(在内部为您分配在堆上),这些可以在运行时更改:

std::string numbers[] = { "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" };

关于c++ - Char 数组指针和 "error: too many initializers for ' char [ ]'",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56699978/

相关文章:

c++ - 从 std::vector 通过引用移除节点

c++ - 2 维数组的大小

c++ - 复制另一个进程正在使用的文件

c++ - 每次运行 "return main();"时如何让变量增加

c++ - 如何在此多重集上设置两种比较器(一种用于插入,一种用于查找)?

c++ - 在结构中自动索引枚举 ID

c++ - 为 python/c++ 初学者有效编写软件的资源/书籍建议

C++ If/Else 语句被跳过

c++ - C++调用基类和派生类构造函数

c++ - 什么是 C++ 临时对象?