如何使用printf从字符串数组中打印单个字符?
比方说我有
char *names[] = { "Tom", "Jerry" };
我想用printf
打印“杰里”中的“e”。 我的第一直觉是
printf("%c\n", *names[5]);
但当我应用我一直在学习的指针时,我意识到这是完全垃圾代码,因为5指的是names
不存在的第五个指针,而不是“Jerry”中的“e”。 names
包含的指针只会引用各自字符串中第一个字符的内存地址。
因此,我真正需要做的是在names[1]
添加一个字节以指向,并在“Jerry”中打印“e”。 但我不确定如何做到这一点,或者它是否在C中被允许。
完成此任务的最佳方法是什么? 先感谢您。
我认为你要找的是printf("%c\n", names[1][1]);
。
问题是你没有多维数组,你有一个包含数组指针的单维数组。
在内存中,您的数组看起来像这样:
+ ---------- + ---------- + | 名字[0] | 名字[1] | + ---------- + ---------- + | | | V | + --------- + | | “杰里”| | + --------- + V + ------- + | “汤姆”| + ------- +
上面的图像应该清楚地表明,当你执行*names[5]
你首先必须记住编译器将其解析为*(names[5])
,这意味着你试图取消引用数组中的第六个条目只有两个条目。 这将导致不确定的行为 。
取第二个字符串: names[1]
,添加一个指向第二个字符: names[1]+1
,并取消引用以获得您指向的内容: *(names[1]+1)
,这也等于names[1][1]
names[1] -----v names[1]+0 ---v v "Jerry" ^ names[1]+1 ----^ *(names[1]+1) == 'e' names[1][1] == 'e'
访问第i
个字符串的第j
个字符为(0-indexed): names[i][j];
names[ nameIndex ][ characterIndex ]
所以如果你想打印“杰里”的“e”: printf("%c\n", names[1][1]);
或“汤姆”的“m”: printf("%c\n", names[0][2]);
使用指针打印’e’(值的第二个字符)Jerry(数组中的第二个值)的最佳方法是*(array [1] +1)(1表示第二个值和char,因为我们从c开始为0)