C語言:將輸入的字符串(char* cp)存入字符指針數組(char * spa[])

在C++下面讀入string類型,存入vector中非常的簡單。在C語言下面讀入string倒是很簡單,但是要存入指針數組中貌似費了很大的勁都不行。C還是四年之前看過,對於C下面的字符串一直很恐懼,今天下定決心,要好好研究一下C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])
**********************************************************************************************
首先來分析字符數組和字符指針:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])
輸出結果如下:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])
字符型數組和字符型指針都是可以表示字符串的,它們的結尾處爲'\0';
一直在說數組名實際上是數組的首地址值,從這點可以看出scanf輸出字符串的原理。因爲字符型指針名傳遞的肯定是地址,所以scanf(“%s”)的原理肯定是找到所傳遞的地址處,挨個的輸出地址中的字符,直到碰到'\0',認爲字符串結束了。
下面可以做個小試驗:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])
輸出的結果如下:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])
實際上char型的數組和指針沒有什麼特殊的性質。它們的特殊之處僅僅在於,當碰到%s,它們表示爲string時,系統知道'\0'表示結束。
**********************************************************************************************
再來分析指針數組:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[]) 
弄明白上面的一點,這個的結果也很容易理解,如下:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[]) 
感覺關鍵就在於"%s"這個選項上,它的機制就是找地址(注意是地址),然後輸出,碰到'\0'結束。
**********************************************************************************************
爲了將字符串存入字符型的指針數組中,首先先搞定字符串存入字符指針中

C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[]) 
結果顯而易見:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])
這裏的原理和第一部分一樣,%s的機理是從地址入手。
**********************************************************************************************
下面是關鍵了,將用戶輸入的字符串存入指針數組中。先模仿C++的思路,寫一個顯而易見的版本。

C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])
結果如下:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[]) 
可以看第48行這裏是一個指針之間的賦值,實際上傳遞的是地址值,所以字符指針數組中的每個值都是tmp的地址值,所以最後結果是一樣的
正確的方法應該是,改變charPointerArray中每一個元素所指的地址中的內容(字符串):
---------------------------------------------------------------------------------------------
使用strcmp可以對字符串的內容賦值,但是將地48行改成如下的形式,會報錯:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])
會出現內存引用的錯誤:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])
可以思考一下這裏是爲什麼?舉個更加簡單的例子來看:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[]) 
這裏也是會報內存引用出錯。strcpy的作用機理是將huan[]的字符複製到chen中,直到'\0'爲止。這裏使用了一個未初始化的字符指針,編譯器不知道該指針指向哪裏,實際上就是一個NULL,對它的應用所以會報錯。
下面可以做一個小測試,使用new爲它分配一個地址,然後再來運行:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])
下面是運行的結果:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])
這裏可以看出,只要不是NULL就可以了(廢話了,NULL的引用必然出錯。。。C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])
所以之前會出現內存的引用出錯,完全是因爲使用了NULL,chen指向不知道的地址,strcpy也不知道往哪裏賦值。
---------------------------------------------------------------------------------------------總結前面得到的兩點,接下來就可以解決最開始提出來的問題:
(1)字符指針還是指針,它顯的特殊,僅僅是因爲%s的內部機制;
(2)對指針的操作前提是指針必須不是NULL。
所以想要char* c的值存入char* sp[]中,必須單獨的爲每個sp[n]先分配內存(C用malloc或C++用new),下面是最後的版本:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[])
哈哈,最後的結果如下:
C語言:將輸入的字符串(char* <wbr>cp)存入字符指針數組(char <wbr>* <wbr>spa[]) 
**********************************************************************************************
    一晚上就搞了這麼一個問題,不過很值得。終於完全弄懂C語言下的字符串了,再也不需要使用stringstream來回避它,哈哈~~~很享受這種慢慢的分析問題到最後解決問題的過程,nice~~~雖然原因現在看起來很2B~~~最後再聲明一遍哈:
(1)字符指針還是指針,它顯的特殊,僅僅是因爲%s的內部機制;
(2)對指針的操作前提是指針必須不是NULL。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章