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;
}