C语言中(字符串)输入scanf()、gets()、fgets()以及getchar()、getc()函数的联系与区别
scanf()函數(shù)的輸入基于獲取“單詞”,如果使用%s格式,字符串以第一個非空白字符開始讀入,讀到(但不包括)下一個空白字符(可以是空格、制表符或者換行符)。使用scanf()把一個字符串讀進一個字符數(shù)組時,不使用&。scanf()函數(shù)返回成功讀入項目的個數(shù),若沒有任何合乎要求的項目讀入,scanf()返回0,當(dāng)它檢測到文件結(jié)尾時,返回EOF(#define指令把EOF的值定義為-1)。
使用格式:
char str[20];
scanf("%s",str);
gets()函數(shù)輸入基于獲取“字符串”,從stdio流中讀取字符串,直至接受到換行符或EOF時停止,并將讀取的結(jié)果存放在buffer指針?biāo)赶虻淖址麛?shù)組中。從字符串的第一個字符開始讀入,讀到第一個“\n”(換行字符)字符。即,讀取換行符之前(不包括換行符)的所有字符,在這些字符后添加一個空字符(\0),然后把這個字符串讀進一個字符數(shù)組。它將讀取換行符并將其丟棄,這樣下一次讀取從新的一行開始。gets()函數(shù)返回一個指向char的指針,返回的指針與傳遞給它的是同一指針。gets()函數(shù)實際的構(gòu)造比較復(fù)雜,因為它有兩個可能的返回值。如果讀入順利,返回讀入字符串的地址;如果出錯或者gets()函數(shù)遇到文件結(jié)尾,它就返回一個空(或0)地址,這個空地址即空指針,用stdio.h中的常量NULL來表示。
由于gets()不檢查目標(biāo)數(shù)組是否能容納輸入,所以很不安全。
使用格式:
char str[20];
char *ptr;
ptr = gets(str);
gets()函數(shù)構(gòu)造:
char *gets(char *s){
……
return(s);
}
fgets()函數(shù)與gets()不同在于它需要第二個參數(shù)來說明最大讀入數(shù),參數(shù)為n,則fgets()就會讀取最多n-1個字符或者讀完一個換行符為止,兩者最先滿足要求的那一個來結(jié)束讀入。fgets()讀取到換行符,就會把它存到字符串里,而不是像gets()那樣丟棄它。它由第三個參數(shù)來說明讀哪一個文件,stdin代表從鍵盤讀入。
使用格式:
char *str;
char *ptr;
ptr = fgets(str,20,stdin);
getchar()函數(shù)沒有參數(shù),它返回來自輸入設(shè)備的下一個字符,putchar()打印它的參數(shù)。這兩個函數(shù)通常在stdio.h中定義,通常是預(yù)處理宏,而非真正的函數(shù)。可以利用循環(huán)將字符依次讀入到字符串?dāng)?shù)組,getchar()可以接收換行符,因此需要在循環(huán)讀入的過程中消除換行字符。
char s[20];
int n=0;
while(1){
s[n]=getchar(); // 讀入1個字符
if (s[n]=='\n')
break; // 如果是換行符,則結(jié)束循環(huán);相當(dāng)于清除緩存中輸入確定的換行符
n++;
}
函數(shù)getc()功能則主要是從流中取字符,從文件指針stream指向的文件流中讀取一個字符,并把它作為函數(shù)值返回給整型變量ch,讀取字符后文件指針并不會移動這和fgetc()函數(shù)是不一樣的,如果讀取失敗或者到了文件結(jié)束標(biāo)志返回EOF(-1)。
int getc(FILE *stream);
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的C语言中(字符串)输入scanf()、gets()、fgets()以及getchar()、getc()函数的联系与区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “马去车回一望尘”上一句是什么
- 下一篇: Linux C程序命令行传参