C語言幾個輸入函數的區別(C語言專家編程成長日記)


The difference of the string and the character(char):

字符串是一個帶有""的字符序列如

"I fuck xuqiang"
annotation:雙引號不是字符串的一部分。雙引號告知編譯器它括起來的是字符串。C語言沒有專門用於存儲字符串的變量類型,字符串都被存儲在char類型的數組中。字符串常量"x"和字符常量'x'不同,區別之一在於'x'是基本類型(char),而"x"是派生類型(char數組);區別之二是"x"實際上由兩個字符串組成:'x'和空字符\0

在C語言中有很多的輸入函數比如scanf()、getchar()、gets(),但它們之間的差別在哪里呢?

1:

首先針對scanf()函數:比如scanf() 配合%s使用,scanf("%s",&a) 但是這種方法只能獲取一個單詞,即遇到空格等空字符就會返回。如果要讀取一行字符串。如果你需要輸入"I fuck xuqiang everday",這個函數將顯得很農民。

2:scanf()函數的特點:

轉換修飾符
修飾符 意義
* 滯后賦值;示例:"%*d"
digit(s) z最大字段寬度;在達到最大字段寬度或者遇到第一個空白字符時(不管哪個先發生都一樣)停止對輸入項的讀取;示例:"%10s"
hh b把整數讀作signed char或unsigned char;示例:"%hhd" "%hhu"
ll b把整數讀作long long或unsigned long long(c99);示例:"%lld" "%llu"
h,l或L "%hd"和"%hi"指示該值將會儲存在一個short int中。"%ho"、"%hx"和"%hu"指示該值將會儲存在一個unsigned short int中。"%ld"和"%li"指示該值將會儲存在一個long中。"%lo"、"%lx"和"%lu"指示該值將會儲存在一個unsigned long中。"%le"、"%lf"和"%lg"指示該值以double類型儲存。將L(而非l)與e、f和g一起使用指示該值以long double類型儲存。如果沒有這些修飾符,d、i、o和x指示int類型,而e、f和g指示float類型;

 

轉換說明符
轉換說明符 意義
%c 把輸入解釋稱一個字符
%d 把輸入解釋稱一個有符號十進制整數
%e,%f,%g,%a 把輸入解釋稱一個浮點數(%a是c99標准)
%E,%F,%G,%A 把輸入解釋稱一個浮點數(%A是c99標准)
%i 把輸入解釋稱一個有符號十進制整數
%o 把輸入解釋稱一個有符號八進制整數
%p 把輸入解釋稱一個指針(一個地址)
%s 把輸入解釋稱一個字符串,輸入內容以第一個非空白字符作為開始,並且包含直到下一個空白字符的全部字符
%u 把輸入解釋稱一個無符號十進制整數
%x,%X 把輸入解釋稱一個無符號十六進制整數
[] 字符集合
getchar有一個int型的返回值.當程序調用getchar時.程序就等着用戶按鍵.用戶輸入的字符被存放在鍵盤緩沖區中.直到用戶按回車為止(回車字符也放在緩沖區中).當用戶鍵入回車之后,getchar才開始從stdio流中每次讀入一個字符.getchar函數的返回值是用戶輸入的第一個字符的 ASCII碼,如出錯返回-1,且將用戶輸入的字符回顯到屏幕.如用戶在按回車之前輸入了不止一個字符,其他字符會保留在鍵盤緩存區中,等待后續getchar調用讀取.也就是說,后續的getchar調用不會等待用戶按鍵,而直接讀取緩沖區中的字符,直到緩沖區中的字符讀完為后,才等待用戶按鍵.
getch與getchar基本功能相同,差別是getch直接從鍵盤獲取鍵值,不等待用戶按回車,只要用戶按一個鍵,getch就立刻返回, getch返回值是用戶輸入的ASCII碼,出錯返回-1.輸入的字符不會回顯在屏幕上.getch函數常用於程序調試中,在調試時,在關鍵位置顯示有關的結果以待查看,然后用getch函數暫停程序運行,當按任意鍵后程序繼續運行.

 Scanf()和getchar()小細節:

1、getchar()讀取每個字符,包括空格、制表符和換行符;而scanf則會跳過空格、制表符和換行符。

#include <stdio.h>
int main()
{
	int guess = 1;
	printf("pick an interger from 1 to 100,.I will try to guess");
	while (getchar() != 'Y')
	{	
            printf("Well ,then,is it %d?\n", ++guess);
            while(getchar()==!'\n')//將enter符號忽略掉。
                  continue;
    }
	printf("I knew I could do it!\n");
	return 0;
}                    

  

 不加getchar()=='\n' 

    加了過后

 

 成功處理掉了getchar()接收'\n'的情況。

 如果只用getchar()會將你的Enter鍵一起讀入(getchar每次讀入一個字符,就會識別你的每一次輸入為兩個字符一個數字,一個回車)造成了此問題。

經過改進(將getchar()和scanf()配合使用:

2、scanf()混合輸入的細節

首先看一個例子:

#include <stdio.h>

int main()
{
	int i=0, j = 0;
	scanf("%d,%d",&i,&j);
	printf("%d,%d", i, j);
	return 0;
}

  如果要輸入連續兩個變量的值,那么你就必須在輸入第一個值后面加上%d后面相同的符號。如本例:(此地方注意一定要與%d后面的符號完全相同,包括符號的大小寫(,,中文逗號和英文逗號都不一樣)。

 

 3、重要細節scanf("%c",ch)和scanf(" %c",ch)(%c前面有一個空格):

第一種會讀取輸入的第一個字符,第二種會讀取輸入的第一個非空字符,跳過空格。並且除了%c其他的轉換都會自動跳過帶輸入值前面的所有的空白。

fputc()、putc()和fgetc()、fgetc()的區別:

  首先我們看原函數定義

  1:int fgetc(FILE *STREAM);int getc(FILE *stream);

  2:int fputc(int c,FILE *stream);int puc(int c,FILE *stream);

  Firstly,我們先來看fgetc、getc的差別。通過翻閱C primer后發現fgetc和getc的區別在於它們的實現上。帶f的函數實現是通過函數來實現的,而不帶f的函數(getc,putc),實現的時候是通過宏定義來實現的。

  書上這樣說:

  1.getc的參數不應當是具有副作用的表達式。

  2.因為fgetc一定是一個函數,所以可以得到其地址。這就允許將fgetc的地址作為一個參數傳送給另一個函數。

  3.調用fgetc所需時間很可能長於調用getc,因為調用函數通常所需的時間長於調用宏。

綜上所述:用就完事了 少BB,在一般的工程可以等同使用影響不大。

解析putchar和getchar():

 

getchar() 用於讀取用戶從鍵盤輸入的單個字符,它有一個整型的返回值,當發生讀取錯誤的時候,返回整型值-1,當讀取正確的時候,它會返回用戶從鍵盤輸的第一個字符的ASCII碼,當程序調用getchar時.運行程序時就等着用戶從按鍵輸入,用戶輸入的字符被存放在鍵盤緩沖區中.直到用戶按回車為止(回車字符也放在緩沖區中),當用戶鍵入回車之后,getchar才開始從輸入流中每次讀入一個字符,輸入的字符不只一個的時候,后續的getchar調用不會等待用戶按鍵,而直接讀取緩沖區中的字符,直到緩沖區中的字符讀完之后,才等待用戶按鍵,getchar函數輸入數字也按字符處理,單個的getchar函數輸入多於一個字符時,只接收第一個字符.

 

 

 由於getchar()只接受了一個字符,故putchar只輸出一個字符到屏幕上。

putchar()

 

putchar()向終端(屏幕)輸出一個字符。其格式為putchar(ch),其中ch可以是被單引號(英文狀態下)引起來的一個字符,可以是介於0~127之間的一個十進制整型數(包含0和127)(超過127就不是ASCII碼了),也可以是事先用char定義好的一個字符型變量當c為一個被單引號(英文狀態下)引起來的字符時,輸出該字符(注:該字符也可為轉義字符),當c為一個介於0~127(包括0及127)之間的十進制整型數時,它會被視為對應字符的ASCII代碼,輸出該ASCII代碼對應的字符;當c為一個事先用char定義好的字符型變量時,輸出該變量所指向的字符。當整型變量ch超出8位變量的范圍時,ch則會變強制轉化為8位變量(即取其低八位傳過去輸出),當為負數的時候,由於計算機存儲負數是用補碼表示的,所以傳過去的二進制補碼也被當做正數處理,也是取其低八位
getchar() and putchar()都需要包含stdio.h頭文件;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM