關於C語言的字符串的學習研究與實驗

很久之前的水货文章了,搬运一下.那时候用的输入法竟然是繁体,我惊了个呆,好久不看繁体,竟然有点看不懂了.

以前學習C語言的時候并沒有太多的關注字符串方面的事情.
導致後來我想把pascal寫的EXKMP代碼翻譯成C語言的時候,我發現我竟然不會用C語言的字符串輸入輸出函數.
於是我萌生了自己寫兩個函數來輸入輸出,靈感來源於《C語言程序設計》這本書.
這本書上給出了兩個自定義的字符串處理函數,但是它們并不能滿足我的要求.
於是我自己學習研究了一下C語言的數組,指針和字符串之間的關係.
成功把我要的函數寫出來了,以後就以此為模板了!
好了,下面進入正題:

不多說,先上代碼:

輸入函數:

1
2
3
4
5
6
int read(char *s){
int x = 0;
while((*s++=getchar())!=10) x++;
*s= 0;
return x;
}

我將兩個函數都定義成返回值為整型的函數,輸入函數返回一個數值為輸入的字符串的長度!輸入函數傳入一個地址,為要讀取的字符串的首地址.

關於主語句while((*s++=getchar())!=’\n’) x++;這是我根據最近所學的運算符的優先級而寫出來,已經是我能寫出來的最簡潔的表達式了,但是個人感覺還是不夠簡潔,要是能把getchar()外面的括號去掉就好了,希望以後能更加簡潔的寫這個句子!

這個讀取函數以換行符為結束標誌,只要讀取到換行符,則停止讀入,并將換行符換成0,因為在C語言中,字符串的最後有一個0字符以表示字符串的結束.

當然以換行符為結束標誌其實是有bug的,因為在文件讀取的時候可能會在還沒碰到換行符時文件就結束了,這樣可能造成程序崩潰,但是如果是從鍵盤標準輸入的話就不會有這個問題,還有就是因為一般的編輯工具都會自動在文件末尾添加一個換行符,所以如果有特殊要求的話再改動吧,這樣子可以應付大部分情況了!

然後是輸出函數:

1
2
3
4
5
int write(char *s){
int x = 0;
while(*s) putchar(*s++),x++;
return x-1;
}

同樣的,輸出函數也會返回所輸出的字符串的長度,當然如果不需要的話,你也可以將其做成viod型,不過一個int所占的內存幾乎可以忽略,無所謂了.

其實輸出函數比輸入函數要好寫一些,但是呢,輸出函數容易出錯,例如我就這樣寫過:while(s)…;然後就苦逼的死循環了!這是基礎問題,指針方面的問題.但是字符串,數組在C語言裡面是和指針有著無法分割的聯繫的,所以指針要學好,畢竟C語言的最大的兩個亮點就是指針和動態內存分配了.看的好多書本里都說指針是C的靈魂,所以指針還是要好好學的.

有了這兩個函數,終於可以放開手腳的去翻譯PASCAL代碼了!還有就是從發現這個問題到解決這個問題,一共過去了兩周的時間,調試代碼的時間加起來大概是四個小時,也就是兩節C程的上機課的時間.