2014-10-06 147 views
1

比方说,我有如何使用printf从字符串数组中打印单个字符?

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

,我想打印的“E”中的“杰里”使用printf。我的第一反应是

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

,但是当我申请我一直在学习指针,我意识到这是总的垃圾代码,因为5是指第五个不存在的指针names,而不是“E”中的“杰瑞”。包含在names中的指针只会涉及其各自字符串中第一个字符的内存地址。

所以看来我真正需要做的是添加一个字节到names[1]指向,并在“杰里”打印“e”。但我不知道如何做到这一点,或者它是否允许在C中。

完成此操作的最佳方法是什么?先谢谢你。

+1

也许'名字[1] [1]'? – juanchopanza 2014-10-06 13:39:57

回答

6

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

+0

它看起来像我需要阅读多维数组。谢谢。 – intelli78 2014-10-06 13:43:21

+0

更正:根据Joachim Pileborg的回答,这不是一个多维数组,而是它相当于两次解除引用。 – intelli78 2014-10-06 17:27:05

1

访问i个字符串的j个字符为(0索引): names[i][j];

1

names[ nameIndex ][ characterIndex ] 所以,如果你想打印 “杰里” 的 “E”: printf("%c\n", names[1][1]); 还是“ m“of”Tom“:printf("%c\n", names[0][2]);

6

事情是你不要有一个多维数组,你有一个单维数组包含指向数组的指针。

在存储您的阵列看起来是这样的:

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

上面的影像应该清楚,当你做*names[5]你首先必须记住,编译器解密,作为*(names[5]),这意味着你尝试在只有两个条目的数组中取消引用第六个条目。这将导致undefined behavior

+0

事实上,它会导致分段错误。但是,帮助我理解......如果数组不是多维的,那么为什么我们使用这个名称[1] [1]语法?这不是表示多维数组吗? – intelli78 2014-10-06 14:04:44

+0

@ intelli78因为您可以对数组和指针使用数组索引语法。事实上,做例如'names [0]'实际上等价于'*(names + 0)'(即它使用指针算术),所以指针和数组几乎是可以互换的(当然也有例外)。 – 2014-10-06 14:10:39

2

在第二个字符串: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' 
0

与指针的最佳方式要打印Jerry(数组中的第二个值)的'e'(值的第二个字符)是*(array [1] +1)(1代表第二个值,因为我们在c中以0开头)

相关问题