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 | 把輸入解釋稱一個無符號十六進制整數 |
[] | 字符集合 |
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頭文件;