<分区>
对于单个(字符串)数组,结尾用\0
表示。例如,如果我创建字符串:
char * string = "hello";
它将表示为 {'h','e','l','l','o','\0'}
。
像下面这样的数组如何表示“它的结束”?
char * strings[] = {"one", "two"};
在遍历循环时,如何检测数组的“结尾”?
标签 c
<分区>
对于单个(字符串)数组,结尾用\0
表示。例如,如果我创建字符串:
char * string = "hello";
它将表示为 {'h','e','l','l','o','\0'}
。
像下面这样的数组如何表示“它的结束”?
char * strings[] = {"one", "two"};
在遍历循环时,如何检测数组的“结尾”?
最佳答案
你可以做这样的事情,这非常类似于字符串的空终止:
char * strings[] = {
"one",
"two",
NULL
};
您可以使用这样的循环打印这些字符串:
char **pp;
for(pp = strings; pp != NULL; pp++)
printf("%s\n", *pp);
但是当我说“你可以做到”时,我是认真的。没有规则规定您必须这样做。 (这与字符串本身形成对比,如果您构造自己的字符串并且希望您的字符串与 strcpy
、printf
等)
我展示的NULL
终止符适用于指针数组。为其他类型(例如 int
数组)选择合适的标记值可能更难。 (如果你知道你的数字都是正数,你可以使用 0 或 -1 作为标记,但如果你的数组既有正数也有负数,你可能会卡住。)
另一种可能性是维护一个单独的计数:
char * strings[] = {
"one",
"two"
};
int nstrings = 2;
int i;
for(i = 0; i < nstrings; i++)
printf("%s\n", strings[i]);
与其手动计算字符串并将 nstrings
显式初始化为 2,更好的技术是让编译器为您完成:
int nstrings = sizeof(strings) / sizeof(strings[0];
sizeof(strings)
为您提供整个数组的大小(以字节为单位),而 sizeof(strings[0])
为您提供一个元素的大小——即是一个指针 -- 以字节为单位,因此除法会为您提供条目数,这就是您想要的。
使用 sizeof
并像那样划分是一个非常常见且完全合法的惯用语,但它有点晦涩难懂,所以我更喜欢用宏封装它(并使其更加 self 记录) ,像这样:
#define SIZEOFARRAY(a) (sizeof(a) / sizeof(a[0])
int nstrings = SIZEOFARRAY(strings);
关于c - 表示多维数组或多指针的结尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57897755/