2017-02-12 138 views
0

所以我宣布了一个2d数组,并希望逐一显示它的行。但是当我执行下面的代码时,我看到矩阵中的所有行都从这个行开始我需要。打印一排2d字符数组(C++)

代码:

#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---- 

我想我的程序做的是,看跌期权被执行时(0),只有 '文学' 应显示当看跌期权( 1)执行时,只显示“Science ---”。

我是初学者。请提出我应该做什么改正。谢谢。 :)

+0

是turbo C++吗? – Pbd

+0

@Pbd很可能,clrscr被使用 – minigeek

+0

10年前我在学校的第一个C++课程的记忆对我来说是稍纵即逝的。 :D – Pbd

回答

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]

+0

顺便说一句,在最后一个字符串中有一个额外的'-',它由12个字符组成。 –

+0

“体育”是6个字符 - 他增加了四个连字符,结果以填充它到10没有错误存在。 – Caleb

+0

@Caleb:Ooops ...没错,谢谢。顺便说一句,你的编辑尝试 - 作为评论更好。 C和C++的答案略有不同(如果我没有记错的话,你的C适合C)。 –

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--- 

A 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] 

消失。

+0

我相信编译器会为每个字符串文字增加一个'\ 0',所以它不是'puts'找不到空字符。 –

+0

是的,你是对的。但是由于初始化器太长,这个尾部的'\ 0'实际上并不存储。因此,下一个字符串立即启动,而不用在中间加入'\ 0'来告诉'puts'字符串已经结束。 –

+0

好的,我倾向于猜测(尽管我不确定,因为我手边没有任何可能的平台),某些编译器会给试图用数量初始化显式大小的数组时出现编译错误大于这个尺寸的元素。 –

1

你不需要提及数组的尺寸显式。编译器完成这项工作。

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

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

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

+0

正确,尽管这会将该数组的性质从一个可修改的字符串数组更改为一个不可修改的字符串数组。如果OP曾试图改变任何这些字符串,那么他/她将遇到另一个问题。 –

+0

@barakmanos是的,你是对的。使用我的代码字符串是只读的。 –

+0

所以你可能想提到这是你答案的一部分(例如,“如果你不打算在你的程序执行过程中改变任何字符串,那么你可以......”)。 –