这是@paddy的答案:
const char * str[5] = {
"That means today is Monday! \n",
"That means today is Tuesday! \n",
"That means today is Wednesday! \n",
"That means today is Thursday! \n",
"That means today is Friday! \n"
};
如果加上周六和周日会发生什么?您需要将 更改5
为7
. 好消息:如果您忘记进行更改,C 编译器会注意到字符串的数量与声明的数组大小不同,并且您会收到错误消息。
但是嗯。那我们为什么要指定数组的长度呢?C 编译器就不能计算出它应该对我们多长时间吗?
事实上,是的。我们所要做的就是忽略这个数字,C 编译器会计算数组中的东西的数量,并使数组正好是那个大小。
但是,当我们去打印字符串时,我们怎么知道有多少?有两种常见的方法可以解决这个问题。
一种是在数组末尾放置一个特殊标记,通常称为“哨兵”值。这里是一个不错的选择NULL
。
因此,让我们对示例进行这些更改:让编译器为我们计数,并在末尾添加一个标记:
这是@paddy的答案:
char const *str[] = {
"That means today is Monday! \n",
"That means today is Tuesday! \n",
"That means today is Wednesday! \n",
"That means today is Thursday! \n",
"That means today is Friday! \n",
NULL
};
现在我们可以重写循环来检查哨兵值:
for (i = 0; str[i]; ++i)
fputs(str[i], fp_out);
这循环并打印,直到值str[i]
变为假。指针将NULL
评估为假,停止循环。
知道列表中有多少东西的另一种方法有点棘手。我们可以使用这个sizeof()
特性来找出数组的大小,但是这个大小是根据sizeof(char)
(在大多数平台上,这意味着字节)给出的。但是我们可以将总大小除以一个元素的大小。这会起作用:
static int const str_count = sizeof(str) / sizeof(char const *);
但是如果你改变类型会发生什么str
?然后你需要记住在sizeof(char const *)
. 更好的是,您可以使用str
它自己来计算元素的大小。像这样:
static int const str_count = sizeof(str) / sizeof(str[0]);
我们甚至可以把它打包成一个宏:
#define ARRAY_LEN(a) (sizeof(a) / sizeof((a)[0]))
static int const str_count = ARRAY_LEN(str);
这是循环:
for (i = 0; i < str_count; ++i)
fputs(str[i], fp_out);
或者,使用宏:
for (i = 0; i < ARRAY_LEN(str); ++i)
fputs(str[i], fp_out);