精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

程序設計基礎:字符能像整數一樣計算

AGk5_ZLG_zhiyua ? 來源:ZLG致遠電子 ? 作者:佚名 ? 2017-08-29 14:36 ? 次閱讀

第一章為程序設計基礎,本文為1.8.1 字符常量。

>>>1.字符常量的引用

字符常量是使用一對單引號“''”包圍起來的,比如,'O','編譯器知道這個符號指的是字母O的ASCII值,即79。同樣可以用' '指出空格,或用'9'指出數字9。常量'9'指的是一個字符,不應該與整數值9混淆。除非程序員能記住ASCII碼表,否則任何人看到79都不會聯想到字母O,而字符常量'O' 則可以直接傳遞它的意義。

C語言中,字符能象整數一樣計算,不需要特別的轉換。基于此,既可以給一個字符加上一個整數,比如,字符c與整數n相加,即c+n表示c后面的第n個字符。也可以從一個字符減去一個整數,比如,表達式c-n表示c前面的第n個字符。還可以從一個字符減去另一個字符,比如,c1和c2都是字符,那么c1-c2表示兩個字符的距離。

更進一步地,還可以比較兩個字符,如果在ASCII表中,c1在c2前面,那么c1

if( ch >= '0' && ch <= '9' )??? { … }

這樣一來就將數字字符與ASCII碼表中的其它字符區分開了。雖然標準C接口ctype.h提供了相應的函數,但如果你從頭到尾實現它們,則有助于進一步深入了解它們的操作。如果ch是大寫字母,返回它對應的小寫字母,否則返回ch本身,詳見程序清單 1.35。

程序清單1.35 tolower()函數范例程序

1 char tolower(char ch)

2 {

3 if( ch >= 'A' && ch <= 'Z' ){????????????????????????????? //標識大寫字母

4 return (ch + ('a' - 'A'));

5 }else{

6 return (ch);

7 }

8 }

>>>2. 字符的輸入輸出

雖然轉換符%c允許scanf()函數和printf()函數對一個單獨的字符進行讀寫操作。比如:

char ch;

scanf("%c", &ch);

printf("%c", ch);

但在讀入字符前,scanf()函數不會跳過空格符,即會將空格作為字符讀入變量ch。為了解決這個問題,則必須在%c的前面加一個空格:

scanf(" %c", &ch);

雖然scanf()函數不會跳過空格符,卻很容易檢測到讀入的字符是否為換行符' '。比如:

while(ch != ' '){

scanf("%c", &ch);

}

當然也可以調用getchar()和putchar()讀寫一個單獨的字符,它們是在stdio.h中定義的宏,分別用于從鍵盤讀取數據和將字符打印到屏幕上。雖然宏和函數在技術上存在一些區別,但它們的用法是一樣的。比如:

int getchar(void);//輸入一個字符

int putchar(int ch);//輸出一個字符

getchar()函數不帶任何參數,它從輸入隊列中返回一個字符。比如,下面的語句讀取一個字符輸入,并將該字符的值賦給變量ch:

ch = getchar();

該語句與下面的語句等效:

scanf("%c", &ch);

putchar()函數打印它的參數,比如,下面的語句將之前賦給ch的值作為字符打印出來:

putchar(ch);

該語句與下面的語句效果相同:

printf("%c", ch);

由于這些函數只處理字符,因此它們比scanf()和printf()函數更快,這兩個函數通常定義在stdio.h中,實際上它們是預處理宏,不是真正的函數。雖然這些宏看起來很簡單,但有時出了問題,卻找不出原因。比如:

char ch1, ch2;

ch1 = getchar();

ch2 = getchar();

printf("%d %d ", ch1, ch2);

此時,如果輸入字符'a',而打印結果卻是“97,10”。因為從鍵盤輸入一個字符后,就打印出了結果,還沒有輸入第二個字符程序就結束了。由于鍵盤輸入一次結束后,會將數據存儲在一個被稱為緩沖區的臨時存儲區,按下Enter鍵后程序才可使用用戶輸入的字符,因此scanf()和getchar()也是從輸入流緩沖區中取值的,而人們常常會產生這樣的錯覺,誤以為它們是從鍵盤緩沖區取值的。實際上,數據是通過cin函數直接從輸入流緩沖區中取走的,所以,當緩沖區中有殘留數據時,cin函數會直接讀取這些殘留數據而不會請求鍵盤輸入。

這里的10恰好是Enter鍵輸入的換行符' ',當讀取數據遇到換行符' '結束時,換行符會一起讀入輸入流緩沖區,所以第一次接受輸入時,取走字符后會留下字符' ',于是第二次直接從緩沖區中將 取走。

為何要有緩沖區呢?首先,將若干字符作為一個塊進行傳輸比逐個發送這些字符節約時間。其次,如果用戶打錯字符,可以直接通過鍵盤修正錯誤。當最后按下Enter鍵時,傳輸的是正確的輸入。雖然輸入緩沖區的好處很多,但在某些交互式程序中也需要無緩沖區輸入。比如,在游戲中,如果希望按下一個鍵就執行相應的命令,因此緩沖輸入和無緩沖輸入各有各的用武之地,但本書假設所有的輸入都是緩沖輸入。

緩沖分為兩類:完全緩沖I/O和行緩沖I/O,完全緩沖輸入指的是當緩沖區被填滿時才刷新緩沖區,內容被發送到目的地,通常出現在文件輸入中。緩沖區的大小取決于系統,常見的大小為512字節和4096字節。行緩沖區I/O指的是在出現換行符時刷新緩沖區,鍵盤輸入通常是行緩沖區輸入,所以在按下Enter鍵后才刷新緩沖區。

getchar()和scanf()

getchar()讀取每個字符,包括空格、制表符和換行符;而scanf()在讀取數字時,則會跳過空格、制表符和換行符。雖然這兩個函數都很好用,但不能混合使用。

雖然putchar()的參數ch定義為int類型,但實質上它接收的是一個char類型字符,因為在putchar()內部,系統會將ch強制轉換為char類型后再使用。如果字符輸出成功,則putchar()返回輸出的字符((char)ch),而不是輸入的參數ch;如果不成功,則返回預定義的常量EOF(end of file,文件結束),EOF是一個整數。

getchar()沒有輸入參數,其返回值為int型,而不是char型。這里需要區分文件中的有效數據和輸入結束符,當有字符可讀時,getchar()不會返回文件結束符EOF,所以

ch = getchar() != EOF //相當于ch = (getchar() != EOF)

取值為true,變量ch被賦值為1。

當程序沒有輸入時,則getchar()返回文件結束符EOF,即表達式取值為false,此時變量ch被賦值為0,程序結束運行。如果將getchar()函數的返回值定義為int型,則既能存儲任何可能的字符,也能存儲文件結束符EOF,將輸入復制到輸出的例程序詳見程序清單1.36。

程序清單1.36將輸入復制到輸出范例程序

1 #include

2 int main(int argc, char *argv[])

3 {

4 int ch;

5

6 while((ch = getchar()) != EOF){

7 putchar(ch);

8 }

9 return 0;

10 }

當然,也可以用getchar()的另一種慣用法替代程序清單1.36(6):

while((ch = getchar()) != ' ')

即將讀入的一個字符與換行符比較,如果測試結果為true,則執行循環體,接著重復測試循環條件,再讀入一個新的字符,同時getchar()用于搜索字符和跳過字符等效。比如:

while((ch = getchar()) == ' ')

當循環終止時,變量ch將包含getchar()遇到的第一個非空字符。

do-while

do-while循環遠比for和while循環用得小,因為它至少需要執行循環體一次,且在代碼的最后而不是開始執行條件循環測試。邏輯條件應該出現在它們所“保護”的代碼之前,這也是if、while和for的工作方式。通常閱讀代碼的習慣是從前向后,當使用do/while循環時,需要對這段代碼讀兩次。同時,這種方式在很多情況下是不正確的,比如:

? do{

? ch = getchar();

? putchar(ch);

? }while(ch != EOF);

由于測試被放在對putchar()的調用之后,因此該代碼無端地多寫了一個字符。只有在某個循環體必須至少執行一次的情況下,使用do-while循環才是正確的。

另一個讓人迷惑的是,do/while循環中的contiune語句:

do{

continue;

}while(false);

它會永遠循環下去還是只執行一次?雖然它只會循環一次,但大多數人都會想一想。C++的開創者Bjarne Stroustrup是這樣說的,“do語句是錯誤和困惑的來源,我傾向于將條件放在前面我能看到的地方,避免使用do語句。”

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言編程
    +關注

    關注

    6

    文章

    90

    瀏覽量

    21093

原文標題:周立功:字符能像整數一樣計算

文章出處:【微信號:ZLG_zhiyuan,微信公眾號:ZLG致遠電子】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Stem32CubeIDEKeil一樣指定不同文件下的代碼編譯嗎?

    Stem32CubeIDEKeil一樣指定不同文件下的代碼編譯
    發表于 07-23 06:22

    DSPARM一樣跑系統嗎?

    本帖最后由 mr.pengyongche 于 2013-4-30 03:25 編輯 平時聽的太多ARM跑系統了,不知道在DSp上能跑系統不??剛開始學DSP,感覺上DSP一樣很強大啊,怎么沒聽過在DSP上跑系統的呢??好希望DSP也
    發表于 03-23 13:52

    如何使中斷輸出循環遞增又遞減的報警聲, 正弦波一樣

    本帖最后由 boya355 于 2014-6-18 13:30 編輯 如何使中斷輸出循環遞增又遞減的報警聲, 正弦波一樣:此程序是 電子工業出版社《單片機C語言
    發表于 06-18 13:30

    TI什么器件wifi一樣被掃描且入低功耗模式

    請問有沒有無線方案是器件可以wifi一樣被掃描且入低功耗模式,設想消費者帶有個無線裝置,能夠使用個電池運行1-2年,當商家進行掃描時
    發表于 03-23 10:49

    allegroAD一樣打印負片嗎?

    求教allegroAD一樣打印負片嗎?如何操作?
    發表于 03-29 01:39

    請問Sub-1 GHz技術,zigbee一樣組網嗎?

    請問Sub-1 GHz技術,zigbee一樣組網嗎?還是只能點對點的傳數據?
    發表于 06-24 07:34

    請問MSP430能用串口下程序嗎?STM32一樣用P***下載程序嗎?

    MSP430能用串口下程序嗎?STM32一樣用P***下載程序嗎?
    發表于 04-04 06:35

    請問AD做的原理圖能否ORCAD一樣加下頁間符數字符號?

    想請教個問題,AD做的原理圖能否orcad一樣加下頁間符數字符
    發表于 09-16 10:27

    LabVIEW是否C語言一樣

    LabVIEW是否C語言一樣
    發表于 09-11 18:41 ?38次下載

    怎么整數一樣計算字符

    章為程序設計基礎
    的頭像 發表于 09-14 10:47 ?3084次閱讀
    怎么<b class='flag-5'>像</b><b class='flag-5'>整數</b><b class='flag-5'>一樣</b><b class='flag-5'>計算</b><b class='flag-5'>字符</b>?

    機器魚真魚一樣游泳

    本周麻省理工學院的研究人員揭開了種看上去一樣游泳的軟體機器人,他們說類似的東西可能會滲透到真正的魚的學校,并收集有關他們行為的數據。
    的頭像 發表于 04-30 05:48 ?3468次閱讀

    機器嬰兒一樣通過眼睛學習世界?

    在Facebook人工智能實驗室負責人楊樂昆(Yann LeCun)看來,人類既然已經教會機器辨別圖片,甚至能做到人臉識別,那么機器也識別視頻。而教會機器學習視頻的方法與嬰兒學習相似。即讓機器嬰兒一樣,觀看視頻,告訴它視頻所
    發表于 05-17 19:21 ?594次閱讀

    Daniel一樣為您計算飲料的設備

    電子發燒友網站提供《以Daniel一樣為您計算飲料的設備.zip》資料免費下載
    發表于 12-19 10:47 ?0次下載
    以<b class='flag-5'>像</b>Daniel<b class='flag-5'>一樣</b>為您<b class='flag-5'>計算</b>飲料的設備

    DJ一樣控制 NeoPixels

    電子發燒友網站提供《DJ一樣控制 NeoPixels.zip》資料免費下載
    發表于 12-28 09:28 ?0次下載
    <b class='flag-5'>像</b>DJ<b class='flag-5'>一樣</b>控制 NeoPixels

    如何 awk一樣分割字符

    ' ] 與我預想的結果不符,多個空格會被分割多次。 那有什么辦法可以達到 awk 一樣的效果呢? 有兩種方法。 第種方法 不加參數,這
    的頭像 發表于 11-02 11:14 ?670次閱讀
    如何<b class='flag-5'>像</b> awk<b class='flag-5'>一樣</b>分割<b class='flag-5'>字符</b>串