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