如何使用printf从字符串数组中打印单个字符?

时间:2014-10-06 13:37:57

标签: c arrays pointers

我们说我有

char *names[] = { "Tom", "Jerry" };

我想打印" e"在" Jerry"使用printf。我的第一直觉是

printf("%c\n", *names[5]);

但是当我应用我已经学过的关于指针的东西时,我意识到这是完全垃圾代码,因为5指的是names中不存在的第五个指针,而不是" e&#34 ;在" Jerry"。 names中包含的指针只会引用各自字符串中第一个字符的内存地址。

所以我真正需要做的是向names[1]添加一个字节指向,然后打印" e"在" Jerry"。但我不确定如何做到这一点,或者它是否在C中被允许。

实现这一目标的最佳方法是什么?提前谢谢。

6 个答案:

答案 0 :(得分:6)

我认为你要找的是printf("%c\n", names[1][1]);

答案 1 :(得分:6)

问题是你没有拥有一个多维数组,你有一个包含数组指针的单维数组。

在内存中,您的数组看起来像这样:

+----------+----------+
| names[0] | names[1] |
+----------+----------+
  |          |
  |          V
  |          +---------+
  |          | "Jerry" |
  |          +---------+
  V
  +-------+
  | "Tom" |
  +-------+

上面的图片应该清楚地说明当你执行*names[5]时,首先必须记住编译器将其解析为*(names[5]),这意味着你试图取消引用数组中的第六个条目只有两个条目。这将导致undefined behavior

答案 2 :(得分:2)

取第二个字符串:names[1],添加一个指向第二个字符:names[1]+1,并取消引用以获取您指向的内容:*(names[1]+1),也等于{{ 1}}

names[1][1]

答案 3 :(得分:1)

j字符串的i字符作为(0-indexed)访问:  names[i][j];

答案 4 :(得分:1)

names[ nameIndex ][ characterIndex ] 所以,如果你想打印" e" " Jerry" : printf("%c\n", names[1][1]); 或者" m"汤姆" :printf("%c\n", names[0][2]);

答案 5 :(得分:0)

使用指针打印'e'(值的第二个字符)Jerry(数组中的第二个值)的最佳方法是*(array [1] +1)(1表示第二个值和char,因为我们从0开始在c)