C語言課件-第10章_第1頁
C語言課件-第10章_第2頁
C語言課件-第10章_第3頁
C語言課件-第10章_第4頁
C語言課件-第10章_第5頁
已閱讀5頁,還剩169頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第10章預處理、輸入/輸出和文件操作C語言的預處理功能由C編譯的預處理程序?qū)崿F(xiàn),負責分析和處理行首以“#”號開頭的控制行。這些控制行包括宏替換、文件包含和條件編譯等。C語言中并沒有專門用于輸入/輸出的語句。為了給出方便的程序接口,C語言中提供了“標準I/O庫”,它是一組函數(shù),可提供一系列I/O服務。第10章預處理、輸入/輸出和文件操作C語10.1預處理功能10.2文件包含10.3條件編譯10.4其他預處理功能10.5庫函數(shù)使用方式10.6常用標準輸入/輸出函數(shù)10.7文件及有關(guān)操作10.8其他一些常用的函數(shù)(宏)10.1預處理功能10.1預處理功能10.1.1簡單宏定義和宏替換 簡單宏定義的一般形式是: #define標識符字符序列 其中,標識符稱作宏名,一般用大寫字母。例如: #definePI3.141592610.1預處理功能10.1.1簡單宏定義和宏替換 對于像PI這樣的宏在進行使用和處理時分為3個步驟:①在函數(shù)之外(往往在程序開頭)使用#define控制行定義宏名;②在程序中使用已定義的宏名;③在程序進行編譯時,由預處理程序?qū)昝M行宏替換,恢復被宏名所代替的字符序列的原貌。例如:#defineN50#definePI3.1415926…inta[N];doubler,l;…l=2*PI*r;… 對于像PI這樣的宏在進行使用和處理時分為3個步驟:①在經(jīng)過宏替換之后,上述代碼實際上就變成:…inta[50];doubler,l;…l=2*3.1415926*r;…經(jīng)過宏替換之后,上述代碼實際上就變成: 有關(guān)宏的定義和使用要注意以下幾點: ①宏定義在源程序中要單獨占用一行,通?!?”號出現(xiàn)在一行的第一個字符的位置,允許在#號的前面有若干空格或制表符,但不允許有其他字符。 ②宏名用大、小寫字母標識都行,為醒目起見,往往用大寫字母表示。 ③用雙引號括起來的標識符不做宏替換。例如: #defineTRUE1 則打印語句 printf("TRUE"); 會打印出TRUE,而不是1。 有關(guān)宏的定義和使用要注意以下幾點: ④宏定義可以嵌套。例如: #definePI3.1415926 #defineTWOPI(2*PI) 在預處理后,語句 c1=TWOPI*r; 便替換成c1=(2*3.1415926)*r; ⑤宏替換只是按原來的定義“機械地”進行替換,不管替換后的結(jié)果是對還是錯。例如: #defineA3+2 那么5/A 被替換成 5/3+2 ④宏定義可以嵌套。例如: 又如:#definePI3.l4l5q/*有錯:4的前面是字母l,5的后面是字母q*/…area=PI*r*r;… 照樣進行宏替換:…area=3.l4l5q*r*r;… 為了避免出現(xiàn)上述第一種情況造成的誤解,應當把字符序列用括號括起來。 #defineA(3+2) 又如: ⑥如果宏定義中的字符序列過長,在一行中放不下,可在該行末尾加續(xù)行符“\”,后隨一個換行符。#defineLONG_STRINGthisisaverylongstringthatisusedas\↙anexample ⑦可以用宏定義來表示數(shù)據(jù)類型。 #defineMAX100 #defineENTRYstructentrytype 在程序中可用ENTRY定義變量: ENTRYtable[MAX],*p; ⑥如果宏定義中的字符序列過長,在一行中放不下,可在該行 ⑧如果宏名出現(xiàn)在#號之后,則不對它進行替換。例如:#defineDEFdefine#DEFN10 ⑨宏名的有效范圍是從定義它的地方開始到其所在文件末尾或者用#undef指令消除該宏定義為止。宏名不受分程序結(jié)構(gòu)的影響,在其有效范圍內(nèi)遵循宏替換的規(guī)則。 ⑧如果宏名出現(xiàn)在#號之后,則不對它進行替換。例如:10.1.2帶參數(shù)的宏定義1.帶參數(shù)宏定義的一般格式帶參數(shù)的宏定義的一般形式是:#define宏名(參數(shù)表)字符序列例如,定義一個計算圓面積的宏:#definePI3.1415926536#definearea(r)(PI*r*r)10.1.2帶參數(shù)的宏定義 例10-2:下面的程序中使用了帶參數(shù)的宏,它計算并輸出給定半徑的圓的面積。#definePI3.1415926536#definearea(r)(PI*r*r)voidmain(){printf("%f\n",area(6.18));} 例10-2:下面的程序中使用了帶參數(shù)的宏,它計算并輸出給 2.幾點使用說明 ①使用宏定義時所帶的實參可以是常量、已被賦值的變量名或者表達式。 例10-3:將例10-2的程序改寫為交互式輸入半徑值的方式。#definePI3.1415926536#definearea(r)(PI*r*r)voidmain(){floatr;printf("Input:r=?\n");scanf("%f",&r);printf("Area=%f\n",area(r));} 2.幾點使用說明 ②帶參數(shù)的宏替換與簡單的宏替換在替換規(guī)則上是一致的,都是機械地進行替換,而不去理解用戶的想法。 例10-4:本例說明宏替換可能存在副作用。#definePI3.1415926536#definearea(r)(PI*r*r)voidmain(){printf("%f\n",area(4+6));} ②帶參數(shù)的宏替換與簡單的宏替換在替換規(guī)則上是一致的,都 為了避免出現(xiàn)與常規(guī)理解上的不一致,建議對宏定義中字符序列的整體和各個參數(shù)都用圓括號括起來。例如, #definearea(r)(PI*(r)*(r)) 那么,area(4+6)將被替換為: (3.1415926536*(4+6)*(4+6)) ③一個宏定義所帶的參數(shù)可以多于一個,每個參數(shù)在宏替換中可以出現(xiàn)多次。 #defineAVG5(a,b,c,d,e)(((a)+(b)+(c)+(d)+(e))/5) 為了避免出現(xiàn)與常規(guī)理解上的不一致,建議對宏定義中字符序列 ④使用帶參數(shù)的宏編寫程序時,應注意:在宏定義中宏名和左圓括號之間沒有空格。我們看一下如下宏定義: #definearea(r)(PI*(r)*(r)) 在area和“(”之間有空格。 例如, x=area(5.6); 替換后的結(jié)果為: x=(r)(3.1415926536*(r)*(r))(5.6); ④使用帶參數(shù)的宏編寫程序時,應注意:在宏定義中宏名和左 3.帶參數(shù)的宏和函數(shù)之間的比較 帶參數(shù)的宏定義與函數(shù)是不同的,不要把二者混淆起來。二者主要的區(qū)別有: 宏定義中不存在參數(shù)類型問題,不僅宏名無類型,而且宏定義中的參數(shù)也無類型。宏名和它的參數(shù)都只是一個符號代表,預處理時進行宏擴展。 而帶參數(shù)的宏在預處理階段進行宏擴展。宏擴展只是簡單地進行字符替換,并不對參數(shù)做任何計算、加工工作。 始終應該記?。篊預處理程序并不去理解用戶編寫的C程序,它只是機械地按照宏替換的定義把程序中的宏調(diào)用擴展為相應的字符序列,而不去“領(lǐng)會”其含義。 3.帶參數(shù)的宏和函數(shù)之間的比較 4.#、##運算符和宏替換嵌套 在標準C語言中提供了兩個僅用于宏替換的運算符:連串運算符#和連結(jié)運算符##。 ①在帶參數(shù)的宏定義中,如果字符序列中的一個形參前面有“#”,那么在進行宏替換時,對應的實參就轉(zhuǎn)換成用雙引號括起來的字符串。 4.#、##運算符和宏替換嵌套例如:#definePR(x)printf(#x)…PR(dataundefined!);…將替換成…printf("dataundefine!");例如:又如:#definestr(s)#s…p=str(helloworld);…將替換成:…p="helloworld";又如: 通常在實參中出現(xiàn)的轉(zhuǎn)義字符在進行宏替換時,#運算符就在它的前面插入一個反斜線字符(\)。如果調(diào)用形式如下: PR("HelloWorld"); 則預處理時將它擴展為: printf("\"HelloWorld\""); ②連結(jié)運算符##可以出現(xiàn)在上述兩種形式的宏定義中。當進行宏替換時,在替換字符序列中(不是在實參中)出現(xiàn)的##被刪除,在##前面和后面出現(xiàn)的兩個形參被相應的實參所替換,并且把它們合成一個單詞。如果連結(jié)的結(jié)果構(gòu)成宏名,則進一步執(zhí)行宏替換處理。 通常在實參中出現(xiàn)的轉(zhuǎn)義字符在進行宏替換時,#運算符就在它例如:#definedebug(s,t)printf("x"#s"=%d,x"#t"=%s",x##s,x##t)…debug(1,2);經(jīng)預處理后,被替換成:…printf("x""1""=%d,x""2""=%s",x1,x2);在字符串字面量聯(lián)接之后,就成為下面形式:printf(“x1=%d,x2=%s”,x1,x2); ③帶參數(shù)的宏替換也可以嵌套定義。例如: 例10-8:下面的程序展示宏的嵌套定義和替換,以及#運算符的應用。#include<stdio.h>#definePI(3.1415926536)#defineFUN(k)(k)*PI#definePR(format,value)printf(#value"=%"#format"\t",(value))#defineNLputchar('\n')#definePRINT1(f,x1)PR(f,x1);NL#definePRINT2(f,x1,x2)PR(f,x1);PRINT1(f,x2) 例10-8:下面的程序展示宏的嵌套定義和替換,以及#運算voidmain(){inti=99;floatarea;area=PI*6.8*6.8;PRINT1(d,i);PRINT2(f,F(xiàn)UN(2)*6.8,area);}程序運行結(jié)果如下:i=99(2)*(3.1415926536)*6.8=42.725660area=145.267242voidmain()10.2文件包含 文件包含是C預處理程序的一種功能,它把指定文件的全部內(nèi)容都包含到本文件之中。文件包含控制行的形式是: #include"文件名" 例如: #include"defs.h"10.2文件包含 文件包含是C預處理程序的一種功C語言課件--第10章 在#include行中出現(xiàn)的文件名往往帶有后綴.h,這種文件通常稱為前導文件(或頭部文件,header)。前導文件中除了可以包括宏定義外,也可以包括類型定義、全程變量和函數(shù)說明等。 文件包含控制行還有另外的形式,即把雙引號改為尖括號: #include<文件名> 在#include行中出現(xiàn)的文件名往往帶有后綴.h,這種 這兩種形式都可以使用,但還是有區(qū)別的:使用尖括號表明應在系統(tǒng)規(guī)定的“標準”目錄中尋找指定的文件,如UNIX系統(tǒng)中就在/usr/include目錄中去找,而不要在源文件所在的目錄中查找;使用雙引號表明應首先在正處理的源文件目錄中搜索指定文件;如未找到,則沿著提供給預處理程序的任選項(如-ls)所指示的查找路徑搜索;如仍未找到,最后查找系統(tǒng)規(guī)定的“標準”目錄。 文件包含控制行可出現(xiàn)在源文件的任何地方,多數(shù)都放在靠近文件開頭的地方。并且一個#include命令只能包含一個文件。 文件包含是可以嵌套的。 要注意,前導文件不能單獨進行編譯,它要附屬于某個C源文件一起編譯。 這兩種形式都可以使用,但還是有區(qū)別的:使用尖括號表明應在10.3條件編譯 條件編譯控制行(又稱條件蘊含)用來根據(jù)外部定義的條件去編譯不同的程序部分。 條件編譯控制行有以下形式:#if常量表達式#ifdef標識符#ifndef標識符#else#elif常量表達式#endif#undef標識符10.3條件編譯 條件編譯控制行(又稱條件蘊含)10.4其他預處理功能(1)行控制#line常數(shù)“文件名”(2)診斷控制#error字符序列(3)#pragma字符序列10.4其他預處理功能(1)行控制10.5庫函數(shù)使用方式 在調(diào)用庫函數(shù)前,還要包含相應的前導文件,使用戶程序和庫函數(shù)能同時編譯和連接。#include<stdio.h>intprintf(constchar*format,…);#include<math.h>doublepow(doublex,doubley); 標準C語言中提供了15個前導文件,表10-1列出它們的名稱和作用。10.5庫函數(shù)使用方式 在調(diào)用庫函數(shù)前,還要包含相應的C語言課件--第10章10.6常用標準輸入/輸出函數(shù)標準I/O函數(shù)文件I/O函數(shù) 標準I/O按其功能大致可分為字符I/O函數(shù)、字符串I/O函數(shù)和格式化I/O函數(shù)。10.6常用標準輸入/輸出函數(shù)標準I/O函數(shù)10.6.1getchar()和putchar()getchar()函數(shù)的語法格式是:#include<stdio.h>intgetchar(void); 它不需要參數(shù),其返回值是用戶從終端上輸入的一個ASCII字符的值.。10.6.1getchar()和putchar()putchar()函數(shù)的語法格式是:#include<stdio.h>intputchar(intc); 它的功能是發(fā)送一個字符(c中的字符)到標準輸出(缺省說明情況下,就是用戶終端)。putchar()函數(shù)的語法格式是: 例10-11:下面是使用getchar()和putchar()函數(shù)的簡單示例。/*echoinputtooutput*/#include<stdio.h>voidmain(){intc;for(;;){c=getchar();if(c!='!')putchar(c);elsebreak;}} 例10-11:下面是使用getchar()和putch10.6.2gets()和puts() gets()接受來自標準輸入的一個字符串,puts()則發(fā)送一個字符串到標準輸出。具有下述函數(shù)原型:char*gets(char*s);intputs(constchar*s);10.6.2gets()和puts()

例10-12:讀入用戶輸入的字符串,并顯示出各個字符相應的十進制編碼值。當輸入空串(同時按下Ctrl鍵和z鍵)時,程序終止。#include<stdio.h>voidmain(){charstring[80],*sp;printf("Whenprompted,typealine.\n"); 例10-12:讀入用戶輸入的字符串,并顯示出各個字符相應do{putchar(':');/*Thisisthepromptchar*/sp=gets(string);do{printf("%c=%d\n",*sp,*sp);}while(*sp++!='\0');/*Haltonnull*/}while(*sp!='\0');/*Haltonnull*/}do{10.6.3printf()和scanf() 1.printf()函數(shù) printf()的功能是按照指定的格式控制把相應參數(shù)值在標準輸出上顯示出來。其函數(shù)說明格式是:#include<stdio.h>intprintf(constchar*format,arg1,arg2,…);10.6.3printf()和scanf() format是指向字符串的指針,該字符串被稱為轉(zhuǎn)換控制字符串。轉(zhuǎn)換控制串中包含兩類字符:一類是普通字符,它們沒有別的含義,只是照原樣在屏幕(stdout文件)上輸出。如: printf("Input:n=?\n"); 另一類字符是構(gòu)成轉(zhuǎn)換說明的字符,用來控制后面的參數(shù)進行轉(zhuǎn)換,按要求的格式輸出數(shù)據(jù)。如: printf("%d,%f,%f\n",a,val,rad); 轉(zhuǎn)換說明是由“%”開頭,其后可順序出現(xiàn)下列成分:0個或多個標志、域?qū)捳f明、精度說明、長度修正符和轉(zhuǎn)換類型字符。 ①標志字符共有5個,它們的表示和含義如表10-2所示。 format是指向字符串的指針,該字符串被稱為轉(zhuǎn)換控制字C語言課件--第10章 ②域?qū)捳f明是十進制數(shù)字串,用來指示相應參數(shù)至少應使用多少個字符的寬度。當相應參數(shù)實際占位超過指定域?qū)挄r,就按實際寬度印出。當參數(shù)值未填滿指定的區(qū)域時,就向右對齊,左邊用空格補充;如果有左對齊標志“-”,就向左對齊,右邊用空格補充。 ②域?qū)捳f明是十進制數(shù)字串,用來指示相應參數(shù)至少應使用多 ③精度說明由小數(shù)點“.”和后面跟隨的一個十進制數(shù)字串組成。對于整數(shù)形式(轉(zhuǎn)換類型字符為d、i、o、u、x和X),它表示至少出現(xiàn)的數(shù)字個數(shù);對于小數(shù)形式(轉(zhuǎn)換類型字符為e、E和f),表示小數(shù)點后面數(shù)字的個數(shù)(小數(shù)點前面至少有一個數(shù)字);對于字符串形式(轉(zhuǎn)換類型字符為s),表示最多印出的字符個數(shù);對于g和G,表示有效數(shù)字的上限。如果精度說明只有小數(shù)點,則精度為0。當精度說明和域?qū)捳f明有矛盾時,以精度說明為準。 ④長度修正符h和l用于有符號或無符號的整數(shù)形式,分別表示短型量和長型量,而L用于小數(shù)形式,表示longdouble。 ⑤轉(zhuǎn)換類型字符共十六個,用來說明對應參數(shù)的類型及輸出格式,如表10-3所示。 ③精度說明由小數(shù)點“.”和后面跟隨的一個十進制數(shù)字串組C語言課件--第10章例10-14:printf()函數(shù)中有關(guān)精度說明的應用示例。#include<stdio.h>voidmain(){charc='A';charname[]="Liuhua";inti=1234;floatx=-123.456789;printf("|%10.2f|%10.2e|\n",x,x);printf("|%10.0f|%10.0e|\n",x,x);printf("|%13.26f|\n",x);例10-14:printf()函數(shù)中有關(guān)精度說明的應用示例printf("|%40.32f|\n",x);printf("|%6.1c|%10.1d|\n",c,i);printf("|%8.20s|%8.3s|%8.1s|%8.0s|\n",name,name,name,name);}運行結(jié)果如下:|-123.46|-1.23e+02||-123|-1e+02||-123.45678710937500000000000000||-123.45678710937500000000000000000000||A|1234||Liuhua|Liu|L||printf("|%40.32f|\n",x); 2.scanf()函數(shù) scanf()函數(shù)的說明格式是: #include<stdio.h> intscanf(constchar*format,argp1,argp2,…); 其中轉(zhuǎn)換控制串format由三類字符組成:①空白字符(空格、制表符、換行符)。此時繼續(xù)讀輸入,直至讀到下面的非空白字符(它不被讀入)或者沒有可讀入的字符為止。②除“%”以外的普通字符。僅當輸入字符流中出現(xiàn)與它們都匹配的字符串時,輸入才能成功;否則,只要有一個字符不匹配,輸入就失敗。③以“%”開頭的轉(zhuǎn)換說明。 2.scanf()函數(shù) 在轉(zhuǎn)換說明中除開頭的%外,其后可順序出現(xiàn)如下成分: ①可選的賦值抑制符“*”,表示跳過下面對應的輸入域,不對該域內(nèi)的數(shù)據(jù)進行轉(zhuǎn)換和賦值。 ②可選的域?qū)捳f明,它是十進制整數(shù),規(guī)定了輸入對象的最大域?qū)挕? ③可選的長度修正符h、l或L,用于指定接收對象的大小。 ④轉(zhuǎn)換類型字符。它是不可缺少的,而上面的3種成分均是任選的。 scanf()的轉(zhuǎn)換類型字符共14個,它們的含義如表10-4所示。 在轉(zhuǎn)換說明中除開頭的%外,其后可順序出現(xiàn)如下成分:C語言課件--第10章10.7文件及有關(guān)操作 10.7.1流和文件的概念 C語言中支持兩種形式的數(shù)據(jù)流,即:文本數(shù)據(jù)流和二進制數(shù)據(jù)流。 文本數(shù)據(jù)流是字符的有序序列,它由字符組成行,每一行由0個或多個字符再加上最后的換行符組成。 二進制數(shù)據(jù)流抽象成一個線性字節(jié)序列。 圖10-2給出兩種數(shù)據(jù)流從內(nèi)存輸出到磁盤文件上的差別。10.7文件及有關(guān)操作 10.7.1流和文件的概念C語言課件--第10章 一般來說,文件是被命名的數(shù)據(jù)的集合體。操作系統(tǒng)是以文件為單位對數(shù)據(jù)進行管理的。 終端文件中有3個文件是特殊的,每個程序都要用到。這3個文件是:標準輸入文件(stdin)—對應終端鍵盤、標準輸出文件(stdout)—對應終端屏幕和標準出錯信息文件(stderr)—也對應終端屏幕。這3個文件對所有運行的程序來說,都是自動設置并且自動打開的。 普通的磁盤文件又分為文本文件和二進制文件。文本文件又稱為ASCII文件。一般文本文件與文本數(shù)據(jù)流相對應,二進制文件與二進制數(shù)據(jù)流相對應。 每個磁盤文件都有一個名字。文件名是作為字符串存放的。 一般來說,文件是被命名的數(shù)據(jù)的集合體。操作系統(tǒng)是以文件為10.7.2文件的打開與關(guān)閉 1.打開文件 所有文件(除3個標準文件以外)在進行讀寫等操作之前都必須顯式地打開,使用完之后應注意關(guān)閉。 為了打開一個文件,要使用fopen()庫函數(shù)。該函數(shù)的原型是: FILE*fopen(constchar*filename,constchar*mode); 實參mode指明打開文件的模式。mode控制該文件被打開后是用于讀、寫還是又讀又寫。mode可用的值如表10-5所示。10.7.2文件的打開與關(guān)閉C語言課件--第10章 fopen()的返回值是一個指向FILE結(jié)構(gòu)的指針,以后對相應打開文件的操作就全部利用這個指針進行,而不再用文件名。 FILE是系統(tǒng)定義的結(jié)構(gòu)類型名,用來記錄控制一個數(shù)據(jù)流所需的各種信息,包括文件讀寫指針、緩沖區(qū)位置、出錯標志和文件結(jié)束標志等。typedefstruct_iobuf{char*_ptr;/*nextcharacterposition*/int_cnt;/*numberofcharacterleft*/char*_base;/*locationofbuffer*/int_flag;/*modeoffileaccess*/int_fd;/*filedescriptor*/}FILE; fopen()的返回值是一個指向FILE結(jié)構(gòu)的指針,以 2.關(guān)閉文件 函數(shù)fclose()關(guān)閉已打開的文件,切斷文件指針fp與相應文件的聯(lián)系。fclose()的函數(shù)原型是: intfclose(FILE*fp); 2.關(guān)閉文件 例10-16:這個程序說明利用fopen()函數(shù)和不同的模式來打開指定的文件。#include<stdio.h>#include<stdlib.h>intmain(){FILE*fp;charch,filename[40],mode[5]; 例10-16:這個程序說明利用fopen()函數(shù)和不同while(1){printf("Enterafilename:");fgets(filename,40,stdin);filename[strlen(filename)-1]=0;printf("Enteramode(max3characters):");fgets(mode,5,stdin);mode[strlen(mode)-1]=0;if((fp=fopen(filename,mode))!=NULL){printf("Successfulopening%sinmode%s\n",filename,mode);while(1){fclose(fp);puts("Enterxtoexit,anyothertocontinue.");if((ch=getc(stdin))=='x')break;elsecontinue;}else{fprintf(stderr,"Erroropeningfile%sinmode%s\n",filename,mode);fclose(fp);perror(filename);puts("Enterxtoexit,anyothertotryagain.");if((ch=getc(stdin))=='x')break;elsecontinue;}}return0;}perror(filename);10.7.3文件的讀寫 寫文件可以有三種方式: ①使用格式化輸出函數(shù)把文本數(shù)據(jù)保存到文件上。 ②使用字符輸出函數(shù)把單個字符或整行字符保存到文件上。 ③使用直接輸出函數(shù)把內(nèi)存區(qū)中的內(nèi)容直接保存到磁盤文件中。 同樣,從文件中讀取數(shù)據(jù)也有三種方式:格式化輸入、字符輸入和直接輸入。10.7.3文件的讀寫 1.格式化文件輸出和輸入 (1)fprintf()函數(shù) 它把輸出數(shù)據(jù)發(fā)送到指定的文件中。其函數(shù)原型為: intfprintf(FILE*fp,char*fmt,…); (2)格式化文件輸入 利用fscanf()庫函數(shù)可以從指定的文件中(而不是鍵盤上)讀取指定格式的數(shù)據(jù)。fscanf()函數(shù)的原型是: intfscanf(FILE*fp,constchar*fmt,…); 1.格式化文件輸出和輸入例10-18:利用fscanf()從文件中讀取格式化的數(shù)據(jù)。#include<stdlib.h>#include<stdio.h>voidmain(){FILE*fp;floatvalue[5];charfilename[20];printf("Inputthefilename.\n");scanf("%s",filename);例10-18:利用fscanf()從文件中讀取格式化的數(shù)據(jù)if((fp=fopen(filename,"r"))==NULL){fprintf(stderr,"Erroropeningfile.\n");exit(1);}fscanf(fp,"%f%f%f%f%f",(value),(value+1),(value+2),(value+3),(value+4));printf("Thevaluesare%f,%f,%f,%f,%f\n",value[0],value[1],value[2],value[3],value[4]);fclose(fp);}if((fp=fopen(filename,"r"))== 2.字符輸入/輸出 (1)字符輸入 實現(xiàn)字符輸入的函數(shù)有3個,它們是getc()、fgetc()和fgets()。前兩個函數(shù)用來輸入單個字符,第三個函數(shù)用來輸入字符行。它們的函數(shù)原型如下:intgetc(FILE*fp);intfgetc(FILE*fp);char*fgets(char*str,intn,F(xiàn)ILE*fp); 2.字符輸入/輸出 (2)字符輸出 用于字符輸出的函數(shù)有兩個:putc()和fputs()。 putc()函數(shù)把單個字符寫到指定的文件中。其函數(shù)原型是: intputc(intch,F(xiàn)ILE*fp); fputs()函數(shù)把一行字符寫到文件中。fputs()的函數(shù)原型是: intfputs(constchar*str,F(xiàn)ILE*fp); (2)字符輸出 3.直接文件輸入/輸出 直接文件輸入/輸出的函數(shù)是fread()和fwrite()。它們用來向二進制數(shù)據(jù)流(文件)進行成批的輸入/輸出。 ①fread()的函數(shù)原型是:intfread(void*ptr,intsize,intcount,F(xiàn)ILE*fp); ②fwrite()的函數(shù)原型是:intfwrite(constvoid*ptr,intsize,intcount,F(xiàn)ILE*fp); 3.直接文件輸入/輸出10.7.4文件定位和出錯檢測 1.文件定位 每個打開的文件都有一個文件位置指針,它指示對相應文件進行讀寫操作的具體位置,所以也稱作文件讀寫指針。讀寫位置總是表示距文件開頭的字節(jié)數(shù)。 ①fseek()函數(shù)可以按照需要把讀寫指針設置為文件中的任意位置,從而實現(xiàn)對文件的隨機存取。fseek()的函數(shù)原型是: intfseek(FILE*fp,longintoffset,intwhence);10.7.4文件定位和出錯檢測 對于二進制文件,新的文件位置是從whence所指示的基點開始加上offset個字符。whence可以取以下三個值中的一個:SEEK_SET:從文件頭開始計算,可用數(shù)字0代表。SEEK_CUR:從文件當前位置開始計算,可用1代表。SEEK_END:從文件尾開始計算,可用2代表。 對于文本文件,whence應該是SEEK_SET,offset應是0或者是先前調(diào)用ftell()函數(shù)時返回的值。 對于二進制文件,新的文件位置是從whence所指示的基點fseek(fp,19000L,SEEK_SET);fseek(fp,50L,SEEK_CUR);fseek(fp,-100L,SEEK_END); ②ftell()函數(shù)用來給出流式文件中讀寫指針的當前值。其函數(shù)原型為: longintftell(FILE*fp);fseek(fp,19000L,SEEK_SET); ③rewind()函數(shù)的功能是把文件的讀寫指針重新設置為該文件的開頭。它的原型是:voidrewind(FILE*fp);其作用等價于:(void)fseek(fp,0L,SEEK_SET) ③rewind()函數(shù)的功能是把文件的讀寫指針重新設 2.文件操作出錯檢測 ①ferror()函數(shù)用來確定文件操作中是否出錯。它的函數(shù)原型為: intferror(FILE*fp); ②clearerr()函數(shù)的作用是清除文件結(jié)束標志和文件出錯標志(置為0)。其函數(shù)原型為: voidclearerr(FILE*fp); ③feof()函數(shù)用來檢測指定文件是否讀寫到文件末尾。僅當文件結(jié)束標志被設置了,函數(shù)feof()才返回一個非0值。它的函數(shù)原型是: intfeof(FILE*fp); 2.文件操作出錯檢測10.8其他一些常用的函數(shù)(宏)(1)ctype.h文件中字符測試的函數(shù)(宏)下列函數(shù)(宏)使用之前要在程序開頭寫上文件包含行:#include<ctype.h>intisalpha(intc);測試c是否為a~z或A~Z間的字母,若成功,返回非0值。intisupper(intc);測試c是否為大寫字母(即A~Z),若成功,返回非0值。10.8其他一些常用的函數(shù)(宏)(1)ctype.h文件intislower(intc);測試c是否為小寫字母(a~z),若成功,返回非0值。intisdigit(intc);測試c是否為數(shù)字:0~9,若成功,返回非0值。intisxdigit(intc);測試c是否為十六進制數(shù)字:0~9和a~f或A~F,若成功,返回非0值。intisalnum(intc);測試c是否為字母或數(shù)字,若成功,返回非0值。intislower(intc);intisspace(intc);測試c是否為空白符、制表符、換行符、垂直制表符、換頁符、回車符,若成功,返回非0值。intispunct(intc);測試c是否為標點符號,即:除字母、數(shù)字、空格以外的可打印字符,若成功,返回非0值。intisprint(intc);測試c是否為可印出字符,即任何圖形字符,若成功,返回非0值。intiscntrl(intc);測試c是否為控制字符,即:0<=c<040||c==0177。若成功,返回非0值。intisspace(intc); (2)exit()和system() exit()和system()函數(shù)都包含在stdlib.h文件中,所以,在使用它們之前應在程序開頭寫上:#include<stdlib.h> exit()的函數(shù)原型是: voidexit(intstatus); system()的函數(shù)原型是: intsystem(constchar*string); 它的作用是把string所指向的字符串傳給用戶當前使用的命令處理程序,由該命令處理程序執(zhí)行參數(shù)所指出的命令,并等待它的完成。如在UNIX環(huán)境下執(zhí)行語句: system("cattest.c"); (2)exit()和system() (3)幾個最常用的函數(shù) 在string.h中有許多對字符串進行比較、復制、加工的函數(shù),下面是幾個最常用的函數(shù)。 ①strcat()的功能是連接兩個字符串。 strcat()的函數(shù)原型是: char*strcat(char*string1,constchar*string2); ②strcmp()的功能是比較兩個字符串。 它的函數(shù)原型是: intstrcmp(constchar*string1,constchar*string2); (3)幾個最常用的函數(shù) ③strcpy()的功能是把一個字符串復制到另一個字符數(shù)組中。C語言并沒有提供字符串賦值的操作符,但是,可利用函數(shù)strcpy()來實現(xiàn)這一功能。strcpy()的函數(shù)原型是: char*strcpy(char*string1,constchar*string2); ④strlen()的功能是統(tǒng)計一個字符串的長度。其函數(shù)原型為: intstrlen(constchar*string); 其返回值是參數(shù)所指向的字符串中字符的個數(shù)(不包括結(jié)尾的空字符)。 ③strcpy()的功能是把一個字符串復制到另一個字 例10-26:寫一個程序,實現(xiàn)最簡單的散列查表算法。 散列(hash)算法是把輸入的名字轉(zhuǎn)換成散列值,然后用這個值作為查表的索引。求散列值的方法很多,這里采用最簡單的一種:把字符串中的字符編碼值相加,除以數(shù)組的長度,其余數(shù)就是該名字的散列值。#include<string.h>#include<stdio.h>#defineHASHSIZE10 例10-26:寫一個程序,實現(xiàn)最簡單的散列查表算法。typedefstructnlist{char*name;intcount;structnlist*next;}NLIST;NLIST*hashtab[HASHSIZE];inthash(char*s);NLIST*lookup(char*s);char*strsave(char*s);NLIST*install(char*name);typedefstructnlist{voidmain(){inti;charstr[20];NLIST*p;printf("Input5names.\n");for(i=0;i<5;i++){scanf("%s",str);p=install(str);printf("p->name=%s\tp->count=%d\n",p->name,p->count);}}voidmain()inthash(char*s)/*formhashvalueforstrings*/{inthashval;for(hashval=0;*s!=’\0’;)hashval+=*s++;hashval%=HASHSIZE;printf("***%d\n",hashval);return(hashval);}inthash(char*s)NLIST*lookup(char*s)/*lookforsinhashtab*/{NLIST*np;for(np=hashtab[hash(s)];np!=NULL;np=np->next)if(strcmp(s,np->name)==0)return(np);/*foundit*/return(NULL);/*notfoundit*/}NLIST*lookup(char*s)/*lookchar*strsave(char*s)/*savesintoaspaceallocated*/{char*p;if((p=(char*)calloc(strlen(s)+1,1))!=NULL)strcpy(p,s);return(p);}char*strsave(char*s)NLIST*install(char*name)/*createanewitemorincreaseitscount*/{NLIST*np;inthashval;if((np=lookup(name))==NULL){/*createanewitem*/np=(NLIST*)calloc(1,sizeof(NLIST));if(np==NULL)return(NULL);NLIST*install(char*name)if((np->name=strsave(name))==NULL)return(NULL);hashval=hash(np->name);np->next=hashtab[hashval];hashtab[hashval]=np;np->count=1;}else/*increasethecount*/np->count++;return(np);}if((np->name=strsave(name))==第10章預處理、輸入/輸出和文件操作C語言的預處理功能由C編譯的預處理程序?qū)崿F(xiàn),負責分析和處理行首以“#”號開頭的控制行。這些控制行包括宏替換、文件包含和條件編譯等。C語言中并沒有專門用于輸入/輸出的語句。為了給出方便的程序接口,C語言中提供了“標準I/O庫”,它是一組函數(shù),可提供一系列I/O服務。第10章預處理、輸入/輸出和文件操作C語10.1預處理功能10.2文件包含10.3條件編譯10.4其他預處理功能10.5庫函數(shù)使用方式10.6常用標準輸入/輸出函數(shù)10.7文件及有關(guān)操作10.8其他一些常用的函數(shù)(宏)10.1預處理功能10.1預處理功能10.1.1簡單宏定義和宏替換 簡單宏定義的一般形式是: #define標識符字符序列 其中,標識符稱作宏名,一般用大寫字母。例如: #definePI3.141592610.1預處理功能10.1.1簡單宏定義和宏替換 對于像PI這樣的宏在進行使用和處理時分為3個步驟:①在函數(shù)之外(往往在程序開頭)使用#define控制行定義宏名;②在程序中使用已定義的宏名;③在程序進行編譯時,由預處理程序?qū)昝M行宏替換,恢復被宏名所代替的字符序列的原貌。例如:#defineN50#definePI3.1415926…inta[N];doubler,l;…l=2*PI*r;… 對于像PI這樣的宏在進行使用和處理時分為3個步驟:①在經(jīng)過宏替換之后,上述代碼實際上就變成:…inta[50];doubler,l;…l=2*3.1415926*r;…經(jīng)過宏替換之后,上述代碼實際上就變成: 有關(guān)宏的定義和使用要注意以下幾點: ①宏定義在源程序中要單獨占用一行,通?!?”號出現(xiàn)在一行的第一個字符的位置,允許在#號的前面有若干空格或制表符,但不允許有其他字符。 ②宏名用大、小寫字母標識都行,為醒目起見,往往用大寫字母表示。 ③用雙引號括起來的標識符不做宏替換。例如: #defineTRUE1 則打印語句 printf("TRUE"); 會打印出TRUE,而不是1。 有關(guān)宏的定義和使用要注意以下幾點: ④宏定義可以嵌套。例如: #definePI3.1415926 #defineTWOPI(2*PI) 在預處理后,語句 c1=TWOPI*r; 便替換成c1=(2*3.1415926)*r; ⑤宏替換只是按原來的定義“機械地”進行替換,不管替換后的結(jié)果是對還是錯。例如: #defineA3+2 那么5/A 被替換成 5/3+2 ④宏定義可以嵌套。例如: 又如:#definePI3.l4l5q/*有錯:4的前面是字母l,5的后面是字母q*/…area=PI*r*r;… 照樣進行宏替換:…area=3.l4l5q*r*r;… 為了避免出現(xiàn)上述第一種情況造成的誤解,應當把字符序列用括號括起來。 #defineA(3+2) 又如: ⑥如果宏定義中的字符序列過長,在一行中放不下,可在該行末尾加續(xù)行符“\”,后隨一個換行符。#defineLONG_STRINGthisisaverylongstringthatisusedas\↙anexample ⑦可以用宏定義來表示數(shù)據(jù)類型。 #defineMAX100 #defineENTRYstructentrytype 在程序中可用ENTRY定義變量: ENTRYtable[MAX],*p; ⑥如果宏定義中的字符序列過長,在一行中放不下,可在該行 ⑧如果宏名出現(xiàn)在#號之后,則不對它進行替換。例如:#defineDEFdefine#DEFN10 ⑨宏名的有效范圍是從定義它的地方開始到其所在文件末尾或者用#undef指令消除該宏定義為止。宏名不受分程序結(jié)構(gòu)的影響,在其有效范圍內(nèi)遵循宏替換的規(guī)則。 ⑧如果宏名出現(xiàn)在#號之后,則不對它進行替換。例如:10.1.2帶參數(shù)的宏定義1.帶參數(shù)宏定義的一般格式帶參數(shù)的宏定義的一般形式是:#define宏名(參數(shù)表)字符序列例如,定義一個計算圓面積的宏:#definePI3.1415926536#definearea(r)(PI*r*r)10.1.2帶參數(shù)的宏定義 例10-2:下面的程序中使用了帶參數(shù)的宏,它計算并輸出給定半徑的圓的面積。#definePI3.1415926536#definearea(r)(PI*r*r)voidmain(){printf("%f\n",area(6.18));} 例10-2:下面的程序中使用了帶參數(shù)的宏,它計算并輸出給 2.幾點使用說明 ①使用宏定義時所帶的實參可以是常量、已被賦值的變量名或者表達式。 例10-3:將例10-2的程序改寫為交互式輸入半徑值的方式。#definePI3.1415926536#definearea(r)(PI*r*r)voidmain(){floatr;printf("Input:r=?\n");scanf("%f",&r);printf("Area=%f\n",area(r));} 2.幾點使用說明 ②帶參數(shù)的宏替換與簡單的宏替換在替換規(guī)則上是一致的,都是機械地進行替換,而不去理解用戶的想法。 例10-4:本例說明宏替換可能存在副作用。#definePI3.1415926536#definearea(r)(PI*r*r)voidmain(){printf("%f\n",area(4+6));} ②帶參數(shù)的宏替換與簡單的宏替換在替換規(guī)則上是一致的,都 為了避免出現(xiàn)與常規(guī)理解上的不一致,建議對宏定義中字符序列的整體和各個參數(shù)都用圓括號括起來。例如, #definearea(r)(PI*(r)*(r)) 那么,area(4+6)將被替換為: (3.1415926536*(4+6)*(4+6)) ③一個宏定義所帶的參數(shù)可以多于一個,每個參數(shù)在宏替換中可以出現(xiàn)多次。 #defineAVG5(a,b,c,d,e)(((a)+(b)+(c)+(d)+(e))/5) 為了避免出現(xiàn)與常規(guī)理解上的不一致,建議對宏定義中字符序列 ④使用帶參數(shù)的宏編寫程序時,應注意:在宏定義中宏名和左圓括號之間沒有空格。我們看一下如下宏定義: #definearea(r)(PI*(r)*(r)) 在area和“(”之間有空格。 例如, x=area(5.6); 替換后的結(jié)果為: x=(r)(3.1415926536*(r)*(r))(5.6); ④使用帶參數(shù)的宏編寫程序時,應注意:在宏定義中宏名和左 3.帶參數(shù)的宏和函數(shù)之間的比較 帶參數(shù)的宏定義與函數(shù)是不同的,不要把二者混淆起來。二者主要的區(qū)別有: 宏定義中不存在參數(shù)類型問題,不僅宏名無類型,而且宏定義中的參數(shù)也無類型。宏名和它的參數(shù)都只是一個符號代表,預處理時進行宏擴展。 而帶參數(shù)的宏在預處理階段進行宏擴展。宏擴展只是簡單地進行字符替換,并不對參數(shù)做任何計算、加工工作。 始終應該記?。篊預處理程序并不去理解用戶編寫的C程序,它只是機械地按照宏替換的定義把程序中的宏調(diào)用擴展為相應的字符序列,而不去“領(lǐng)會”其含義。 3.帶參數(shù)的宏和函數(shù)之間的比較 4.#、##運算符和宏替換嵌套 在標準C語言中提供了兩個僅用于宏替換的運算符:連串運算符#和連結(jié)運算符##。 ①在帶參數(shù)的宏定義中,如果字符序列中的一個形參前面有“#”,那么在進行宏替換時,對應的實參就轉(zhuǎn)換成用雙引號括起來的字符串。 4.#、##運算符和宏替換嵌套例如:#definePR(x)printf(#x)…PR(dataundefined!);…將替換成…printf("dataundefine!");例如:又如:#definestr(s)#s…p=str(helloworld);…將替換成:…p="helloworld";又如: 通常在實參中出現(xiàn)的轉(zhuǎn)義字符在進行宏替換時,#運算符就在它的前面插入一個反斜線字符(\)。如果調(diào)用形式如下: PR("HelloWorld"); 則預處理時將它擴展為: printf("\"HelloWorld\""); ②連結(jié)運算符##可以出現(xiàn)在上述兩種形式的宏定義中。當進行宏替換時,在替換字符序列中(不是在實參中)出現(xiàn)的##被刪除,在##前面和后面出現(xiàn)的兩個形參被相應的實參所替換,并且把它們合成一個單詞。如果連結(jié)的結(jié)果構(gòu)成宏名,則進一步執(zhí)行宏替換處理。 通常在實參中出現(xiàn)的轉(zhuǎn)義字符在進行宏替換時,#運算符就在它例如:#definedebug(s,t)printf("x"#s"=%d,x"#t"=%s",x##s,x##t)…debug(1,2);經(jīng)預處理后,被替換成:…printf("x""1""=%d,x""2""=%s",x1,x2);在字符串字面量聯(lián)接之后,就成為下面形式:printf(“x1=%d,x2=%s”,x1,x2); ③帶參數(shù)的宏替換也可以嵌套定義。例如: 例10-8:下面的程序展示宏的嵌套定義和替換,以及#運算符的應用。#include<stdio.h>#definePI(3.1415926536)#defineFUN(k)(k)*PI#definePR(format,value)printf(#value"=%"#format"\t",(value))#defineNLputchar('\n')#definePRINT1(f,x1)PR(f,x1);NL#definePRINT2(f,x1,x2)PR(f,x1);PRINT1(f,x2) 例10-8:下面的程序展示宏的嵌套定義和替換,以及#運算voidmain(){inti=99;floatarea;area=PI*6.8*6.8;PRINT1(d,i);PRINT2(f,F(xiàn)UN(2)*6.8,area);}程序運行結(jié)果如下:i=99(2)*(3.1415926536)*6.8=42.725660area=145.267242voidmain()10.2文件包含 文件包含是C預處理程序的一種功能,它把指定文件的全部內(nèi)容都包含到本文件之中。文件包含控制行的形式是: #include"文件名" 例如: #include"defs.h"10.2文件包含 文件包含是C預處理程序的一種功C語言課件--第10章 在#include行中出現(xiàn)的文件名往往帶有后綴.h,這種文件通常稱為前導文件(或頭部文件,header)。前導文件中除了可以包括宏定義外,也可以包括類型定義、全程變量和函數(shù)說明等。 文件包含控制行還有另外的形式,即把雙引號改為尖括號: #include<文件名> 在#include行中出現(xiàn)的文件名往往帶有后綴.h,這種 這兩種形式都可以使用,但還是有區(qū)別的:使用尖括號表明應在系統(tǒng)規(guī)定的“標準”目錄中尋找指定的文件,如UNIX系統(tǒng)中就在/usr/include目錄中去找,而不要在源文件所在的目錄中查找;使用雙引號表明應首先在正處理的源文件目錄中搜索指定文件;如未找到,則沿著提供給預處理程序的任選項(如-ls)所指示的查找路徑搜索;如仍未找到,最后查找系統(tǒng)規(guī)定的“標準”目錄。 文件包含控制行可出現(xiàn)在源文件的任何地方,多數(shù)都放在靠近文件開頭的地方。并且一個#include命令只能包含一個文件。 文件包含是可以嵌套的。 要注意,前導文件不能單獨進行編譯,它要附屬于某個C源文件一起編譯。 這兩種形式都可以使用,但還是有區(qū)別的:使用尖括號表明應在10.3條件編譯 條件編譯控制行(又稱條件蘊含)用來根據(jù)外部定義的條件去編譯不同的程序部分。 條件編譯控制行有以下形式:#if常量表達式#ifdef標識符#ifndef標識符#else#elif常量表達式#endif#undef標識符10.3條件編譯 條件編譯控制行(又稱條件蘊含)10.4其他預處理功能(1)行控制#line常數(shù)“文件名”(2)診斷控制#error字符序列(3)#pragma字符序列10.4其他預處理功能(1)行控制10.5庫函數(shù)使用方式 在調(diào)用庫函數(shù)前,還要包含相應的前導文件,使用戶程序和庫函數(shù)能同時編譯和連接。#include<stdio.h>intprintf(constchar*format,…);#include<math.h>doublepow(doublex,doubley); 標準C語言中提供了15個前導文件,表10-1列出它們的名稱和作用。10.5庫函數(shù)使用方式 在調(diào)用庫函數(shù)前,還要包含相應的C語言課件--第10章10.6常用標準輸入/輸出函數(shù)標準I/O函數(shù)文件I/O函數(shù) 標準I/O按其功能大致可分為字符I/O函數(shù)、字符串I/O函數(shù)和格式化I/O函數(shù)。10.6常用標準輸入/輸出函數(shù)標準I/O函數(shù)10.6.1getchar()和putchar()getchar()函數(shù)的語法格式是:#include<stdio.h>intgetchar(void); 它不需要參數(shù),其返回值是用戶從終端上輸入的一個ASCII字符的值.。10.6.1getchar()和putchar()putchar()函數(shù)的語法格式是:#include<stdio.h>intputchar(intc); 它的功能是發(fā)送一個字符(c中的字符)到標準輸出(缺省說明情況下,就是用戶終端)。putchar()函數(shù)的語法格式是: 例10-11:下面是使用getchar()和putchar()函數(shù)的簡單示例。/*echoinputtooutput*/#include<stdio.h>voidmain(){intc;for(;;){c=getchar();if(c!='!')putchar(c);elsebreak;}} 例10-11:下面是使用getchar()和putch10.6.2gets()和puts() gets()接受來自標準輸入的一個字符串,puts()則發(fā)送一個字符串到標準輸出。具有下述函數(shù)原型:char*gets(char*s);intputs(constchar*s);10.6.2gets()和puts()

例10-12:讀入用戶輸入的字符串,并顯示出各個字符相應的十進制編碼值。當輸入空串(同時按下Ctrl鍵和z鍵)時,程序終止。#include<stdio.h>voidmain(){charstring[80],*sp;printf("Whenprompted,typealine.\n"); 例10-12:讀入用戶輸入的字符串,并顯示出各個字符相應do{putchar(':');/*Thisisthepromptchar*/sp=gets(string);do{printf("%c=%d\n",*sp,*sp);}while(*sp++!='\0');/*Haltonnull*/}while(*sp!='\0');/*Haltonnull*/}do{10.6.3printf()和scanf() 1.printf()函數(shù) printf()的功能是按照指定的格式控制把相應參數(shù)值在標準輸出上顯示出來。其函數(shù)說明格式是:#include<stdio.h>intprintf(constchar*format,arg1,arg2,…);10.6.3printf()和scanf() format是指向字符串的指針,該字符串被稱為轉(zhuǎn)換控制字符串。轉(zhuǎn)換控制串中包含兩類字符:一類是普通字符,它們沒有別的含義,只是照原樣在屏幕(stdout文件)上輸出。如: printf("Input:n=?\n"); 另一類字符是構(gòu)成轉(zhuǎn)換說明的字符,用來控制后面的參數(shù)進行轉(zhuǎn)換,按要求的格式輸出數(shù)據(jù)。如: printf("%d,%f,%f\n",a,val,rad); 轉(zhuǎn)換說明是由“%”開頭,其后可順序出現(xiàn)下列成分:0個或多個標志、域?qū)捳f明、精度說明、長度修正符和轉(zhuǎn)換類型字符。 ①標志字符共有5個,它們的表示和含義如表10-2所示。 format是指向字符串的指針,該字符串被稱為轉(zhuǎn)換控制字C語言課件--第10章 ②域?qū)捳f明是十進制數(shù)字串,用來指示相應參數(shù)至少應使用多少個字符的寬度。當相應參數(shù)實際占位超過指定域?qū)挄r,就按實際寬度印出。當參數(shù)值未填滿指定的區(qū)域時,就向右對齊,左邊用空格補充;如果有左對齊標志“-”,就向左對齊,右邊用空格補充。 ②域?qū)捳f明是十進制數(shù)字串,用來指示相應參數(shù)至少應使用多 ③精度說明由小數(shù)點“.”和后面跟隨的一個十進制數(shù)字串組成。對于整數(shù)形式(轉(zhuǎn)換類型字符為d、i、o、u、x和X),它表示至少出現(xiàn)的數(shù)字個數(shù);對于小數(shù)形式(轉(zhuǎn)換類型字符為e、E和f),表示小數(shù)點后面數(shù)字的個數(shù)(小數(shù)點前面至少有一個數(shù)字);對于字符串形式(轉(zhuǎn)換類型字符為s),表示最多印出的字符個數(shù);對于g和G,表示有效數(shù)字的上限。如果精度說明只有小數(shù)點,則精度為0。當精度說明和域?qū)捳f明有矛盾時,以精度說明為準。 ④長度修正符h和l用于有符號或無符號的整數(shù)形式,分別表示短型量和長型量,而L用于小數(shù)形式,表示longdouble。 ⑤轉(zhuǎn)換類型字符共十六個,用來說明對應參數(shù)的類型及輸出格式,如表10-3所示。 ③精度說明由小數(shù)點“.”和后面跟隨的一個十進制數(shù)字串組C語言課件--第10章例10-14:printf()函數(shù)中有關(guān)精度說明的應用示例。#include<stdio.h>voidmain(){charc='A';charname[]="Liuhua";inti=1234;floatx=-123.456789;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論