1. 程式人生 > >C語言輸入輸出總結

C語言輸入輸出總結

C語言中基本的輸入輸出函式有:

putchar ():把變數中的一個字元常量輸出到顯示器螢幕上;
getchar ();從鍵盤上輸入一個字元常量,此常量就是該函式的值;
printf    ();把鍵盤中的各類資料,加以格式控制輸出到顯示器螢幕上;
scanf     ();從鍵盤上輸入各類資料,並存放到程式變數中;
puts      ():把陣列變數中的一個字串常量輸出到顯示器螢幕上;
gets      ():從鍵盤上輸入一個字串常量並放到程式的陣列中.
sscanf(); 從一個字串中提取各類資料。

      putchar() 和 getchar() 顧名思議就是從輸入流中獲取一個字元和輸出一個字元,比較簡單,不再多講。
例子如下:
char c = getchar();
putchar(c);

      格式化輸入輸出

scanf()和printf()是最有用的,所以重點講一下。

printf():
一般形式:
printf("格式控制".輸出列表);  
eg : printf("a=%d,b=%f,c=%c/n",a,b,c);
1;格式控制.
格式控制是用雙引號括起來的字串,也稱"轉換控制字串",它包含以下兩部分資訊.
格式說明:由"%"和格式字元組成,如%d,%f,%c,他的作用是把輸出資料轉換為指定格式輸出,格式的說明總是由"%"字元開始的.
普通字元:需要原樣輸出的字元,或者是一些有特殊含義的字元,如/n,/t。

2;輸出列表
就是需要輸出的一些資料,也可以是表示式,如果在函式中需要輸出多個變數或表示式,則要用逗號隔開.

      一些特殊字元的輸出:
單引號,雙引號,和反斜槓的輸出在前面加轉義字元”/”
如:”/’”    ,    “/””     ,    “//”
%的輸出用兩個連在一起的%%,即printf(“%%”);


常用的格式說明如下:
格式字元
d    以十進位制形式輸出帶符號整數(正數不輸出符號)
o    以八進位制形式輸出無符號整數(不輸出字首O)
x    以十六進位制形式輸出無符號整數(不輸出字首OX)
u    以十進位制形式輸出無符號整數
f    以小數形式輸出單精度實數
lf以小數形式輸出雙精度實數
e    以指數形式輸出單、雙精度實數
g    以%f%e中較短的輸出寬度輸出單、雙精度實數
c    輸出單個字元
s    輸出字串

      這裡強調一下:網上很多文章都說f 和lf是一樣的,即不管單精度,雙精度浮點數,都可以用f, 但我在POJ上做過測試,輸出Double時用f確實也可以 ,但讀入時,用f就報WA,所以大家如果對Double進行讀寫的話,都用lf吧。
說到Double,再囉嗦一句,建議大家要用到浮點數時都用Double,不要用float,因為在很多情況下,float精度不夠會導致WA。

特殊:
對64位整數的輸入輸出
,在POJ上的C++環境下(即VC),64位整數是:
__int64      (注意int前面是兩個下劃線)
輸入輸出格式為”%I64d”.
在G++環境下(即Dev C++) 64位整數是
long long
輸入輸出格式為”%lld”.


輸出寬度

  用十進位制整數來表示輸出的最少位數。 注意若實際位數多於定義的寬度,則按實際位數輸出, 若實際位數少於定義的寬度則補以空格或0。

精度
  精度格式符以“.”開頭,後跟十進位制整數。意義是:如果輸出數字,則表示小數的位數;如果輸出的是字元, 則表示輸出字元的個數;若實際位數大於所定義的精度數,則截去超過的部分。

標誌格式字元
-    結果左對齊,右邊填空格
+    輸出符號(正號或負號)空格輸出值為正時冠以空格,為負時冠以負號

例如:
double c=24212345.24232;
printf(“%020.4”);    表示輸出精確到小數點後4位,輸出佔20位,若有空餘的位補0.

      scanf:

scanf的很多用法都是和printf對應的,故不再贅述。
說一下scanf一個特別好用的地方,就是可以濾去一些不想要的東西。
舉例說明如下:
比如輸入為日期 yyyy-mm-dd,就可以這樣寫:
int year,moth,day;
scanf(“%d-%d-%d”,&year,&moth,&day);
再比如:
scanf("%3d %*3d %2d",&m,&n);        輸入113 118 69回車(系統將113賦予m,將69賦予n,因為*號表示跳過它相應的資料所以118不賦予任何變數)

puts()用的不多,且基本都能用printf()代替,故不再多說。

gets()是從輸入流中獲取一行字串放入字元陣列中:
char in[100];
gets(in);

大家可能最容易出錯的地方就是字串的輸入,所以強調一下:
能進行字元,字串輸入的有:
getchar(), scanf(“%c”); scanf(“%s”), gets()

其中getchar() 和 scanf(“%c”)的功能是一樣的。
需要注意的是,這兩個函式讀入的是輸入流中當前位置的字元,
比如:
      scanf(“%d”,&n);
           c = getchar();
假設輸入 67/ (假設“/”代表回車),則第一個scanf讀入一個整數67後,當前輸入流的位置是67之後,即指向回車符,所以第二個getchar()讀入的就是一個回車符了,即 c = ‘/n’。

同樣,gets()也是從當前位置讀入一行字串。
比如:
scanf(“%d”,&n);
gets(str);
此時讀入字元陣列中的字串就是“/n” 了
所以通常在用scanf讀入一個非字串的型別之後,如果要讀入字元,或字元陣列,都用一個額外的getchar()把回車符讀掉,若後面跟的不止一個回車符,可能還有多餘的空格的話,就用gets()讀掉。

      和以上不同的是,scanf(“%s”) 讀入的時候是會忽略掉空格,回車和製表符的。並且以空格,回車和製表符作為字串結束的標誌。

      經常會有這樣的題,輸入第一行是一個整數,接下來每行的第一個是一個字元,用來表示某種操作,後面再跟一些資料,比如:
4
A 100 2
B 23
A 23 89
B 34
像這種輸入就需要小心,讀入字元時不要讀成回車符。
為了防止意外,我一般是這樣處理這類輸入的:
char model[2];
Scanf(“%d”,&n);
for(…,…,…){
      scanf(“%s”,model);
      if(model[0] == ‘A’){
}
else{
}
}

      sscanf():
sscanf()經常用來分解字串,功能非常強大,但很多功能都需要正則表示式的知識,所以就介紹一下最簡單的幾種用法,大家如果想了解更多的話,自己去網上找吧。
1.
char str[100],str1[100],str2[100];
gets(str);
sscanf(str,”%s%s”,str1,str2);
將讀入的一整行字串按空格,製表符或回車符分割成兩個字串。
2
取指定長度的字串。如在下例中,取最大長度為4位元組的字串。
  sscanf("123456 ", "%4s", str);


      對於C++的輸入輸出就不再詳細的講了,因為cin,cout的速度實在太慢,不推薦使用,我一般都是到萬不得已時才用。
      比如當你要讀入字串到string 物件中時,就只能用cin了,這時候還有一個常見的問題,就是如何將一整行字串讀入一個string 中,這就要用到getline函數了。
用法為:
getline(cin, str);
第一個引數就是標準輸入流cin ,第二個引數是接收讀入資料的string物件,本來還有第三個引數,是結束符的標誌,但通常用它預設的就可以了,所以不用管。

注意區分這個getline和cin.getline的區別:
cin.getline的用法如下:
char str[20];
cin.getline(str,20); 表示從讀入的一行字串中,取最多20各字元放入字元陣列str中,注意此處的str是字元陣列,而上面的str是string物件。


      另外需要注意的是,千萬不要把cout和printf混用,因為cout是帶緩衝的而printf不帶,所以會使得輸出的資料順序混亂。