[英]How to print an array of strings
我正在尝试打印一个字符串数组。 这是我到目前为止的代码:
#include <stdio.h>
void print_array (char * strings[]) {
size_t array_length = sizeof(strings) / sizeof(strings[0]);
for (int i=0; i < array_length; i++)
printf("%s, ", strings[i]);
}
int main(void) {
char * strings[] = {
"Hello",
"Zerotom",
"new"
};
// it does work here...
printf("Array size: %lu\n", sizeof(strings) / sizeof(strings[0]));
// but not here
print_array(strings);
return 0;
}
由此,我收到一条警告,上面写着:
strings.c:4:30: 警告:数组 function 上的 sizeof 参数将返回 'char **' 的大小而不是 'char *[]' [-Wsizeof-array-argument] size_t array_length = sizeof(strings) /字符串[0]);
但是,如果我将 function arg 从char * strings[]
更改为char **
,它会返回错误的长度(1 而不是 3)。 我在这里做错了什么?
您可以在main()
中打印strings
但不能在print_array
中打印字符串的原因是数组如何在访问时转换为指针。 这意味着当您访问一个数组(以下 4 个例外)时,该数组将转换为指向数组中第一个元素的指针。 转换发生后,就像您将数组作为参数传递给 function 一样,您只有一个指针,而不是数组。
C11 标准(以及 C17 标准)内容如下:
数组指针转换
(p3) 除非它是sizeof
运算符、 _Alignof
运算符或一元'&'
运算符的操作数,或者是用于初始化数组的字符串字面量,否则类型为“类型数组”的表达式将转换为类型为“类型指针”的表达式,它指向数组 object 的初始元素,并且不是左值。 C11 标准 - 6.3.2.1 其他操作数 - 左值、arrays 和 function 指示符 (p3)
如果您在上面注意到,当与sizeof
运算符一起使用时,数组不会转换为指针,因此在main()
中, sizeof(strings) / sizeof(strings[0])
提供了字符串数组中的元素数。 但是,在将strings
传递给print_array
之后,已经发生了到指针的转换,因此在print_array
中,您尝试使用sizeof
会导致:
size_t array_length = sizeof(a_pointer) / sizeof(a_char);
(在 x86_64 上为8
,在 x86 上为4
)
您有两个选择(1)将数组中的元素数作为第二个参数传递给print_array
,或者(2)在strings
NULL
中设置最后一个指针(用作标记值)。 然后在print_array
你可以迭代strings[i]
直到它是NULL
。
几个简单的例子:
传递元素数量
#include <stdio.h>
void print_array (char **strings, size_t nptrs)
{
for (size_t i = 0; i < nptrs; i++)
printf("%s, ", strings[i]);
putchar ('\n');
}
int main(void) {
char *strings[] = { "Hello",
"Zerotom",
"new" };
print_array (strings, sizeof strings/sizeof *strings);
return 0;
}
示例使用/输出
$ ./bin/prnarray
Hello, Zerotom, new,
将 Sentinel NULL
添加到strings
#include <stdio.h>
void print_array (char **strings)
{
for (size_t i = 0; strings[i]; i++)
printf("%s, ", strings[i]);
putchar ('\n');
}
int main(void) {
char *strings[] = { "Hello",
"Zerotom",
"new",
NULL }; /* sentinel NULL */
print_array (strings);
return 0;
}
(相同的输出)
至少有几种方法可以使用for
或while
循环,或者使用指向strings
的指针和指针算术,或者使用数组索引(区别是简单的语义,因为你正在做同样的事情)。 如果您还有其他问题,请仔细查看并告诉我。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.