打印一行2d char数组(C ++)

时间:2017-02-12 05:00:53

标签: c++ arrays multidimensional-array

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

代码:

#include<iostream.h>
#include<conio.h>
#include<stdio.h>

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

void main()
{
    clrscr();
    cout<<topics[0][0]<<endl<<topics[1][0]<<endl<<topics[2][0]<<endl;
    puts(topics[0]);
    cout<<endl;
    puts(topics[1]);
    getch();
}

输出:

L    
S   
S   
LiteratureScience---Sports----         
Science---Sports----

我希望我的程序要做的是当执行puts(0)时,只有&#39;文献&#39;应该显示,当执行puts(1)时,只有&#39;科学---&#39;显示。

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

3 个答案:

答案 0 :(得分:3)

宣言:

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

编译器将其视为:

char topics[3][10]={"Literature\0","Science---\0","Sports----\0"};

这意味着每个字符串中的每一个都包含11个字符。

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

答案 1 :(得分:1)

问题是C中的字符串被\0终止。因此,您需要11个字符来存储长度为10的字符串。如果您使数组太小,则只需跳过最后一个字符(请参阅Why "initializer-string for array of chars is too long" compiles fine in C & not in C++?)。因此,puts在字符串的末尾找不到\0而是转到数组的末尾,因为(幸运的是)数组后面的内存为零。如评论所述,这可以修复使阵列正确的大小

#include <stdio.h>

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

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

输出

Literature
Science---

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]

离开。

答案 2 :(得分:1)

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

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

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

请注意,通过这种方式,这些字符串是只读