[英]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
有两个维度:
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.