问题:我只想打印数组names中定义的三个元素,而不更改定义的数组大小。该程序当前将打印出这三个元素,但在遍历所有20个元素时也将打印出十七行。
问题:当如何检查一个没有至少一个字符的值的元素时,如何创建循环打破条件?换句话说,我如何不打印出多余的十七行?
#include <stdio.h>
#define MAX_I 20
#define MAX_J 20
int main() {
char names[MAX_I][MAX_J] = {"Foo", "Bar", "Baz"};
// First example
printf("Example 1:\n");
for (int i = 0; i < MAX_I; i++) {
for (int j = 0; j < MAX_J; j++) {
printf("%c", names[i][j]);
}
printf("\n");
}
// Second example
printf("\nExample 2:\n");
for (char* iter : names) {
printf("%s\n", iter);
}
}
一个空的C字符串的第一个(也是唯一一个!)元素设置为'\0'
(又名0
)。
您的数组声明将对其余元素进行零初始化,因此您可以依靠此规则。
因此:
#include <stdio.h>
#define MAX_I 20
#define MAX_J 20
int main() {
char names[MAX_I][MAX_J] = {"Foo", "Bar", "Baz"};
// First example
printf("Example 1:\n");
for (int i = 0; i < MAX_I; i++) {
// *** This block is new ***
if (names[i][0] == '\0')
{
// Empty string! Skip this, and all following
break;
}
for (int j = 0; j < MAX_J; j++) {
// *** This block is new ***
if (names[i][j] == '\0')
{
// End of string!
break;
}
printf("%c", names[i][j]);
}
printf("\n");
}
// Second example
printf("\nExample 2:\n");
for (char* iter : names) {
// *** This block is new ***
if (iter[0] == '\0')
{
// Empty string! Skip this, and all following
break;
}
printf("%s\n", iter);
}
}
注意,在您的第一个示例中,我还自由地跳过打印结尾的null。
二维数组的每个元素(类型为char[MAX_I]
的一维数组]
char names[MAX_I][MAX_J] = {"Foo", "Bar", "Baz"};
未显式初始化的是隐式初始化的,如
{ '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' }
其中pf零的个数等于MAX_I
。因此,实际上,未明确初始化的元素包含空的c字符串。
因此,输出数组的显式初始化元素的循环可以通过以下方式查看]]
for ( size_t i = 0; i < MAX_I && *names[i]; i++ ) { std::cout << names[i] << '\n'; }
或
for ( size_t i = 0; i < MAX_I && names[i][0] != '\0'; i++ ) { std::cout << names[i] << '\n'; }
或者如果是C程序,则>
for ( size_t i = 0; i < MAX_I && *names[i]; i++ ) { puts( ames[i] ); }
或
for ( size_t i = 0; i < MAX_I && names[i][0] != '\0'; i++ ) { puts( ames[i] ) }