C++ 打印一行二维字符数组(C+;+;)

C++ 打印一行二维字符数组(C+;+;),c++,arrays,multidimensional-array,C++,Arrays,Multidimensional Array,所以我声明了一个2d数组,并希望逐个显示它的行。但是当我执行下面的代码时,我看到矩阵中的所有行都是从我需要的行开始的 代码: 我想让我的程序做的是,当执行puts(0)时,只显示“文献”,当执行puts(1)时,只显示“科学---” 我是初学者。请建议我应该做什么更正。谢谢。:) 宣言: char topics[3][10]={"Literature","Science---","Sports----"}; 编译器将其视为: char topics[3][10]={"Literature\0"

所以我声明了一个2d数组,并希望逐个显示它的行。但是当我执行下面的代码时,我看到矩阵中的所有行都是从我需要的行开始的

代码:

我想让我的程序做的是,当执行puts(0)时,只显示“文献”,当执行puts(1)时,只显示“科学---”

我是初学者。请建议我应该做什么更正。谢谢。:)

宣言:

char topics[3][10]={"Literature","Science---","Sports----"};
编译器将其视为:

char topics[3][10]={"Literature\0","Science---\0","Sports----\0"};
这意味着这些字符串中的每一个都由11个字符组成

因此,您需要将
主题[3][10]
更改为
主题[3][11]

声明:

char topics[3][10]={"Literature","Science---","Sports----"};
编译器将其视为:

char topics[3][10]={"Literature\0","Science---\0","Sports----\0"};
这意味着这些字符串中的每一个都由11个字符组成


因此,您需要将
主题[3][10]
更改为
主题[3][11]
问题是C中的字符串以
\0
结尾。因此,您需要
11
chars来存储长度为10的字符串。如果将数组设置得太小,将跳过最后一个字符(请参阅)。因此,puts不会在字符串末尾找到
\0
,而是转到数组末尾,因为(幸运的是)数组后面的内存包含零。如前所述,这是可以修复的,使数组具有正确的大小

#include <stdio.h>

char topics[3][11]={"Literature","Science---","Sports----"};

int main()
{
    puts(topics[0]);
    puts(topics[1]);
}

一个C++编译器不接受你的程序:

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

走开。

问题是C中的字符串以
\0
结尾。因此,您需要
11
chars来存储长度为10的字符串。如果将数组设置得太小,将跳过最后一个字符(请参阅)。因此,puts不会在字符串末尾找到
\0
,而是转到数组末尾,因为(幸运的是)数组后面的内存包含零。如前所述,这是可以修复的,使数组具有正确的大小

#include <stdio.h>

char topics[3][11]={"Literature","Science---","Sports----"};

int main()
{
    puts(topics[0]);
    puts(topics[1]);
}

一个C++编译器不接受你的程序:

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

走开。

您无需明确提及该数组的维度。编译器完成这项工作

const char *topics[] = {"Literature", "Science---", "Sports----"};

int main() {
    puts(topics[0]);
    puts(topics[1]);
}

注意,通过这种方式,这些字符串是只读的,您不需要明确地提到数组的维度。编译器完成这项工作

const char *topics[] = {"Literature", "Science---", "Sports----"};

int main() {
    puts(topics[0]);
    puts(topics[1]);
}


注意,这样的字符串是<强>只读< /强> .< /p> @ PBD,可能是,CLSRR是10年前在我的学校里的第一个C++类课程的记忆。DYou应该使用

[11]
,因为这些字符串中的每一个都已经包含10个非空字符。@barakmanos,在回答中发布这个。这是correct@Pbd十年前?沃泽斯。10年前,Turbc++已经过时了10年。@ PBD可能是,CLSRR是用我10年前在学校的第一个C++类课程的记忆传给我的。DYou应该使用
[11]
,因为这些字符串中的每一个都已经包含10个非空字符。@barakmanos,在回答中发布这个。这是correct@Pbd十年前?沃泽斯。10年前,TurboC++已经过时10年了。顺便说一句,在最后一个字符串中有一个额外的
-
,这使得它甚至由12个字符组成。“Sports”是6个字符,因此他添加了四个连字符以将其填充到10。这里没有错误。@Caleb:oops。。。没错,谢谢。顺便说一句,你的编辑尝试-它作为一个评论更好。C和C++的答案略有不同(如果我记得正确的话,你的C适合)。顺便说一下,你在最后一个字符串中有一个额外的<代码> ->代码,它甚至包含12个字符。“Stand”是6个字符,他添加了四个连字符,结果把它填充到10个字符。这里没有错误。@Caleb:oops。。。没错,谢谢。顺便说一句,你的编辑尝试-它作为一个评论更好。C和C++的答案略有不同(如果我记得正确的话,C适合C)。我相信编译器对每个字符串文字加上<代码> 0代码/代码>,所以它不是关于代码>放置> /代码>没有找到Null字符。是的,你是正确的。但由于初始值设定项太长,因此实际上不会存储尾部的
\0
。因此,下一个字符串立即开始,中间没有一个
\0
来告诉
put
字符串已经结束。好的,我倾向于猜测(虽然我不确定,因为我手头没有所有可能的平台),某些编译器在试图初始化一个显式大小的数组时,如果数组中的元素数量大于该大小,就会出现编译错误。在C语言中,这只是一个警告。在C++中,我不相信编译器会把一个<代码> 0个/>代码添加到每个字符串文字中,所以它不是关于代码>放置>代码>没有找到Null字符。是的,你是正确的。但由于初始值设定项太长,因此实际上不会存储尾部的
\0
。因此,下一个字符串立即开始,中间没有一个
\0
来告诉
put
字符串已经结束。好的,我倾向于猜测(虽然我不确定,因为我手头没有所有可能的平台),某些编译器在试图初始化一个显式大小的数组时,如果数组中的元素数量大于该大小,就会出现编译错误。在C语言中,这只是一个警告。在C++中,它是不允许的,尽管这会改变数组从可修改字符串数组到非可修改字符串数组的性质。如果OP试图更改这些字符串中的任何一个,那么他/她将遇到另一个问题。@barakmanos是的,你是对的。使用我的代码字符串是只读的。因此,您可能希望在回答中提到这一点(例如,“如果您不打算在程序执行期间更改任何这些字符串,那么您可以…”)。正确,但这会将此数组的性质从可修改字符串数组更改为不可修改字符串数组。如果OP试图更改这些字符串中的任何一个,那么他/她将遇到另一个问题。@barakmanos是的,你是对的。使用我的代码字符串