繁体   English   中英

如何打印字符串数组

[英]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;
}

(相同的输出)

至少有几种方法可以使用forwhile循环,或者使用指向strings的指针和指针算术,或者使用数组索引(区别是简单的语义,因为你正在做同样的事情)。 如果您还有其他问题,请仔细查看并告诉我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM