天天看點

scanf()、gets()、fgets總結

gets

讀取換行符之前(不包括換行符)的所有字元,在這些字元後添加一個空字元(\0),然後把這個字元串交給調用它的程式。

它将讀取換行符并将其丢棄,這樣下一次讀取就會在新的一行開始。

c Primer plus上的例子:

#include <stdio.h>

#define  MAX 81

int main(void)
{
	char *ptr;
	char name[MAX];	/* 配置設定空間*/
	printf("what's your name?");
	ptr = gets(name);
	printf("%s?ah ! %s!\n", name,ptr);
	return 0;
}	
           

gets()函數通過兩種方式擷取輸入:

1.使用一個位址把字元串賦予name

2.get()代碼使用return關鍵字傳回字元串的位址,程式把這個位址配置設定給ptr.

如果出錯或者gets()遇到檔案結尾,就傳回一個空(或0)位址。這個空位址成為空指針,并用stdio.h裡定義的常量NULL表示。

是以gets()加入一些錯誤檢測while(gets(name)  != NULL),getchar的錯誤檢測為:while((ch = getchar())!=EOF)

ps:空指針是一個位址,而空字元是一個char類型的資料對象,其值為0。數值上兩者都可以用0表示,但概念不同,NULL是一個指針,

而0是一個char類型常量。

fgets

彌補gets()不檢查預留存儲區是否能夠容納實際輸入數組,造成多處的字元溢出到響鈴記憶體區。fgets()是為檔案I/O設計。

與gets不同方面為:

1.需要參數說明最大讀入字元數。如果參數值為n,讀取做多n-1個字元或者讀完一個換行符為止,由兩者最先滿足結束輸入。

2.存取換行符。不像gets()那樣丢棄

3.參數說明讀哪一個檔案。從鍵盤上讀可以使用stdin.

#include <stdio.h>

#define  MAX 81

int main(void)
{
	char *ptr;
	char name[MAX];	/* 配置設定空間*/
	printf("what's your name?\n");
	ptr = fgets(name,MAX,stdin);
	printf("%s?ah ! %s!\n", name,ptr);
	return 0;
}	
           

scanf

使用%s格式,字元串讀到(但不包括)下一個空白字元(空格、制表符或換行符)。如果指定了字段的寬度,比如%5s,scanf就會讀入5個字元

或直到遇到第一個空白字元,有二者最先滿足的那個終止輸入。

scanf()函數傳回一個整數值,這個值是成功讀取的項目數;或者遇到檔案結束時傳回EOF。

#include <stdio.h>

#define  MAX 81

int main(void)
{
	char name1[11],name2[11];
	int count;
	printf("please enter 2 names.\n");
	count = scanf("%5s %10s", name1 ,name2);
	printf("i read the %d names %s and %s.\n",
		count, name1, name2);
	return 0;
}