dream.in.java

          能以不變應萬變是聰明人做事的準則。萬事從小事做起,積累小成功,問鼎大成功,是成功者的秘訣。

          C語言輸入輸出總結

          C語言輸入輸出總結
          2007-09-29 13:58

          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不帶,所以會使得輸出的數據順序混亂。

          posted on 2009-03-12 16:45 YXY 閱讀(691) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 云林县| 阳原县| 岳池县| 土默特左旗| 光泽县| 滦平县| 平度市| 来宾市| 张掖市| 金华市| 姜堰市| 山东省| 若尔盖县| 伊吾县| 苏尼特左旗| 金昌市| 静宁县| 昭平县| 兴文县| 青州市| 望奎县| 育儿| 筠连县| 淮南市| 城固县| 万盛区| 突泉县| 中山市| 曲阳县| 大悟县| 扎兰屯市| 措勤县| 嘉定区| 安顺市| 壶关县| 汤原县| 邳州市| 西乌珠穆沁旗| 彰化市| 宽城| 通道|