【編程語言】fgets以及strncmp和strcmp的用法和區別

1)

對於fgets()函數

在打開一個文件時,用fgets函數去讀取文件的每一行,fgets()函數會系統默認從上次讀取的位置開始讀取,也可以設置它的指針偏移量來控制每次要讀取的哪一行。一般對於要讀取一個文件的制定行可以通過判斷要讀取的字符串,就可以讀取到你要取的那一行。

示例代碼如下:

#include
#include
#include

int main()
{
    FILE *fp;
	fp = fopen ("/mnt/hgfs/Linux/dict/dict.txt","r");
	while(fgets(RED_buf,MAXLEN_DATA,fp) != NULL){
		if (strncmp(RED_buf,pXP->data,strlen(pXP->data)) == 0){
			memset (buffer,0x00,sizeof(struct XProtocol));
			pXP = (struct XProtocol *)buffer;
			strcpy((char *)pXP->data,RED_buf);
			write(connfd,buffer,sizeof(struct XProtocol));
			}
	}
		
	return 0	
}

【1】第一種情況:
當定義了一個字符串數組的buff大小,就限定了這個buff能夠放幾個字符在裏面,但是要考慮到的是,在fgets函數輸入時系統會默認在字符串數組的最後一位添加一個'\n',這樣一來,當你要放的字符串大小剛剛等於你自己設定的大小是,可能會覺得可以放完你的字符串,可是結果你會發現最後一個字符沒有打印出來,這就是系統默認'\n'的原因。
如下圖的情況:

【2】第二種情況當你把buff的大小改爲8的時候就可以存放kano的字符串了,你也看到會打印出來兩個kano的字符,

可是你會發現沒有打印出you can see this sentence 這句話。

對於這是因爲strcmp比較兩個字符串數組的時候會要求兩個字符串完全相同纔可以,

對於在定義的時候testbuff中就已經確定字符串的數組會在後面系統默認添加'\0'空字符

這樣表面看來打印在屏幕是兩個相同的kano,可是是有很大區別的,只要你仔細看 ,也會發現對於puts函數的輸出時會有個換行符造成的空格。這就是fgets函數在標準輸入到buff中的所導致的原因。從而導致兩個KANO看着相同,卻沒有打印判斷條件裏面的一句話。




【3】對於這種情況,我們在標準輸入之後,再在buf後面把系統添加的'\n'換成''\0'這樣兩個字符串數組就一樣了,就這樣打印出判斷條件裏面的一句話了。


【4】對於strcnmp函數,又會發現一種特殊情況,當我輸入kano  hello這句話是,也會打印中間的一句話,這是因爲strcmp和strcnmp函數的卻別,就是strcnmp中間n的含義,表示只比較字符串數組有相同的4個字符一樣就導致條件成立,就會打印出中間的一句話。不要求和strcmp函數必須要兩個字符串數組完全相同纔可以,你也會發現【1】第一種情況,這裏只打印了 kano he  六個字符和一個空字符(空格)。


發佈了65 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章