所以我已经声明了一个二维数组,并希望逐个显示它的行。但是当我执行下面的代码时,我看到矩阵中的所有行都是从我需要的那一行开始的。
代码:
#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;显示。
我是初学者。请建议我应该做些什么更正。谢谢。 :)
答案 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]);
}
请注意,通过这种方式,这些字符串是只读。