2014-10-06 82 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開頭)

相關問題