繁体   English   中英

如何打印字符串数组的内容?

[英]How do I print the contents of an array of strings?

我已经使用以下字符串创建并初始化了一个数组:

char print_names[][10] = {"\t\t1. John\n",
                          "\t\t2. Smith\n",
                          "\t\t3. Jane\n",
                          "\t\t4. Mary\n",
                          "\t\t5. Lisa\n"};

据我所知,数组的名称是一个指针本身。 所以当我把这些行:

    printf("%c", *print_names[0]);
    printf("%c", *print_names[1]);

它应该指向那个数组元素的内容。 但是控制台上没有打印任何内容。

我进入调试器,它清楚地显示每个元素都包含适当的字符串。 我不确定我哪里做错了。

编辑:我仍在学习有关数组和指针的基础知识,所以我没有在文件中包含<string.h>

附加问题:是否可以在不使用字符串的情况下打印内容(名称)?

好的。 我想到了。 我想我现在明白了。 谢谢回答。

*print_names[0]等于print_names[0][0] 它是print_names中第一个字符串的第一个字符。

由于print_names数组中每个字符串的第一个字符是制表符 ( '\\t' ),您可以打印这个实际上并不可见的制表符。

如果要打印字符串本身,则需要使用%s作为格式,并传递指向第一个字符的指针。 可以这样做:

printf("%s", print_names[0]);

另一方面,如果您打印选项卡并使其可见,则用其他字符包围输出。 喜欢

printf("tab = \"%c\"\n", print_names[0][0]);

这将打印由双引号包围的选项卡。

数组print_names有两个维度:

  • 元素的数量由初始值设定项确定:在您的示例中为 5
  • 数组中每个元素中的char元素数定义为10

问题是 5 个初始化器正好有 10 个字符,一个有 11 个字符。 初始值设定项与对象定义不一致,并且没有一个元素是空终止字符串。

您应该将宽度更改为至少 12,并且您可以使用printf()以这种方式打印数组元素:

#include <stdio.h>

void print_array() {
    char print_names[][12] = {
        "\t\t1. John\n",
        "\t\t2. Smith\n",
        "\t\t3. Jane\n",
        "\t\t4. Mary\n",
        "\t\t5. Lisa\n"
    };
    size_t count = sizeof(print_names) / sizeof(print_names[0]);
    for (size_t i = 0; i < count; i++) {
        printf("%s", print_names[i]);
    }
}

关于你的方法:

据我所知,数组的名称是一个指针本身。

不是真的:数组的名称就是这样。 当您在sizeof(n)以外的表达式中使用数组的名称时,它会衰减为指向数组第一个元素的指针。

下面的行输出第一个和第二个字符串的第一个字节:

printf("%c", *print_names[0]);  // same as print_names[0][0]
printf("%c", *print_names[1]);  // same as print_names[1][0]

由于您对数组进行了超尺寸(有 10 个条目,但您只填充了 5 个,其他填充了NULL指针),您可以打印数组内容(每行一个字符串):

char **p;
for (p = print_names; *p; p++)
    printf("%s", *p);

这相当于此代码:

int i;
for (i = 0; print_names[i]; i++)
    printf("%s", print_names[i]);

如果您知道数组中有 5 个元素:

int i;
for (i = 0; i < 5; i++)
    printf("%s", print_names[i]);

它有效,但因为每行的第一个元素是 \\t 你不会看到任何你也可以使用的东西

printf("%s", print_names[0])

打印:\\t\\t1。 约翰\\n
这一行。

请注意,您在数组的第二维中放置了 10 个以上的字符。

暂无
暂无

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

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