在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

怎么像整數(shù)一樣計(jì)算字符?

AGk5_ZLG_zhiyua ? 來(lái)源:未知 ? 作者:佚名 ? 2017-09-14 10:47 ? 次閱讀

周立功教授數(shù)年之心血之作《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》,電子版已無(wú)償性分享到電子工程師與高校群體,經(jīng)周立功教授授權(quán),本公眾號(hào)特對(duì)本書(shū)內(nèi)容進(jìn)行連載,愿共勉之。

第一章為程序設(shè)計(jì)基礎(chǔ),本文為1.8.1 字符常量。

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

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

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

更進(jìn)一步地,還可以比較兩個(gè)字符,如果在ASCII表中,c1在c2前面,那么c1

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

這樣一來(lái)就將數(shù)字字符與ASCII碼表中的其它字符區(qū)分開(kāi)了。雖然標(biāo)準(zhǔn)C接口ctype.h提供了相應(yīng)的函數(shù),但如果你從頭到尾實(shí)現(xiàn)它們,則有助于進(jìn)一步深入了解它們的操作。如果ch是大寫(xiě)字母,返回它對(duì)應(yīng)的小寫(xiě)字母,否則返回ch本身,詳見(jiàn)程序清單 1.35。

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

1 char tolower(char ch)

2 {

3 if( ch >= 'A' && ch <= 'Z' ){????????????????????????????? //標(biāo)識(shí)大寫(xiě)字母

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

5 }else{

6 return (ch);

7 }

8 }

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

雖然轉(zhuǎn)換符%c允許scanf()函數(shù)和printf()函數(shù)對(duì)一個(gè)單獨(dú)的字符進(jìn)行讀寫(xiě)操作。比如:

char ch;

scanf("%c", &ch);

printf("%c", ch);

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

scanf(" %c", &ch);

雖然scanf()函數(shù)不會(huì)跳過(guò)空格符,卻很容易檢測(cè)到讀入的字符是否為換行符'\n'。比如:

while(ch != '\n'){

scanf("%c", &ch);

}

當(dāng)然也可以調(diào)用getchar()和putchar()讀寫(xiě)一個(gè)單獨(dú)的字符,它們是在stdio.h中定義的宏,分別用于從鍵盤(pán)讀取數(shù)據(jù)和將字符打印到屏幕上。雖然宏和函數(shù)在技術(shù)上存在一些區(qū)別,但它們的用法是一樣的。比如:

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

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

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

ch = getchar();

該語(yǔ)句與下面的語(yǔ)句等效:

scanf("%c", &ch);

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

putchar(ch);

該語(yǔ)句與下面的語(yǔ)句效果相同:

printf("%c", ch);

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

char ch1, ch2;

ch1 = getchar();

ch2 = getchar();

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

此時(shí),如果輸入字符'a',而打印結(jié)果卻是“97,10”。因?yàn)閺逆I盤(pán)輸入一個(gè)字符后,就打印出了結(jié)果,還沒(méi)有輸入第二個(gè)字符程序就結(jié)束了。由于鍵盤(pán)輸入一次結(jié)束后,會(huì)將數(shù)據(jù)存儲(chǔ)在一個(gè)被稱(chēng)為緩沖區(qū)的臨時(shí)存儲(chǔ)區(qū),按下Enter鍵后程序才可使用用戶(hù)輸入的字符,因此scanf()和getchar()也是從輸入流緩沖區(qū)中取值的,而人們常常會(huì)產(chǎn)生這樣的錯(cuò)覺(jué),誤以為它們是從鍵盤(pán)緩沖區(qū)取值的。實(shí)際上,數(shù)據(jù)是通過(guò)cin函數(shù)直接從輸入流緩沖區(qū)中取走的,所以,當(dāng)緩沖區(qū)中有殘留數(shù)據(jù)時(shí),cin函數(shù)會(huì)直接讀取這些殘留數(shù)據(jù)而不會(huì)請(qǐng)求鍵盤(pán)輸入。

這里的10恰好是Enter鍵輸入的換行符'\n',當(dāng)讀取數(shù)據(jù)遇到換行符'\n'結(jié)束時(shí),換行符會(huì)一起讀入輸入流緩沖區(qū),所以第一次接受輸入時(shí),取走字符后會(huì)留下字符'\n',于是第二次直接從緩沖區(qū)中將\n取走。

為何要有緩沖區(qū)呢?首先,將若干字符作為一個(gè)塊進(jìn)行傳輸比逐個(gè)發(fā)送這些字符節(jié)約時(shí)間。其次,如果用戶(hù)打錯(cuò)字符,可以直接通過(guò)鍵盤(pán)修正錯(cuò)誤。當(dāng)最后按下Enter鍵時(shí),傳輸?shù)氖钦_的輸入。雖然輸入緩沖區(qū)的好處很多,但在某些交互式程序中也需要無(wú)緩沖區(qū)輸入。比如,在游戲中,如果希望按下一個(gè)鍵就執(zhí)行相應(yīng)的命令,因此緩沖輸入和無(wú)緩沖輸入各有各的用武之地,但本書(shū)假設(shè)所有的輸入都是緩沖輸入。

緩沖分為兩類(lèi):完全緩沖I/O和行緩沖I/O,完全緩沖輸入指的是當(dāng)緩沖區(qū)被填滿時(shí)才刷新緩沖區(qū),內(nèi)容被發(fā)送到目的地,通常出現(xiàn)在文件輸入中。緩沖區(qū)的大小取決于系統(tǒng),常見(jiàn)的大小為512字節(jié)和4096字節(jié)。行緩沖區(qū)I/O指的是在出現(xiàn)換行符時(shí)刷新緩沖區(qū),鍵盤(pán)輸入通常是行緩沖區(qū)輸入,所以在按下Enter鍵后才刷新緩沖區(qū)。

getchar()和scanf()

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

雖然putchar()的參數(shù)ch定義為int類(lèi)型,但實(shí)質(zhì)上它接收的是一個(gè)char類(lèi)型字符,因?yàn)樵趐utchar()內(nèi)部,系統(tǒng)會(huì)將ch強(qiáng)制轉(zhuǎn)換為char類(lèi)型后再使用。如果字符輸出成功,則putchar()返回輸出的字符((char)ch),而不是輸入的參數(shù)ch;如果不成功,則返回預(yù)定義的常量EOF(end of file,文件結(jié)束),EOF是一個(gè)整數(shù)。

getchar()沒(méi)有輸入?yún)?shù),其返回值為int型,而不是char型。這里需要區(qū)分文件中的有效數(shù)據(jù)和輸入結(jié)束符,當(dāng)有字符可讀時(shí),getchar()不會(huì)返回文件結(jié)束符EOF,所以

ch = getchar() != EOF //相當(dāng)于ch = (getchar() != EOF)

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

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

程序清單1.36將輸入復(fù)制到輸出范例程序

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 }

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

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

即將讀入的一個(gè)字符與換行符比較,如果測(cè)試結(jié)果為true,則執(zhí)行循環(huán)體,接著重復(fù)測(cè)試循環(huán)條件,再讀入一個(gè)新的字符,同時(shí)getchar()用于搜索字符和跳過(guò)字符等效。比如:

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

當(dāng)循環(huán)終止時(shí),變量ch將包含getchar()遇到的第一個(gè)非空字符。

do-while

do-while循環(huán)遠(yuǎn)比f(wàn)or和while循環(huán)用得小,因?yàn)樗辽傩枰獔?zhí)行循環(huán)體一次,且在代碼的最后而不是開(kāi)始執(zhí)行條件循環(huán)測(cè)試。邏輯條件應(yīng)該出現(xiàn)在它們所“保護(hù)”的代碼之前,這也是if、while和for的工作方式。通常閱讀代碼的習(xí)慣是從前向后,當(dāng)使用do/while循環(huán)時(shí),需要對(duì)這段代碼讀兩次。同時(shí),這種方式在很多情況下是不正確的,比如:

? do{

? ch = getchar();

? putchar(ch);

? }while(ch != EOF);

由于測(cè)試被放在對(duì)putchar()的調(diào)用之后,因此該代碼無(wú)端地多寫(xiě)了一個(gè)字符。只有在某個(gè)循環(huán)體必須至少執(zhí)行一次的情況下,使用do-while循環(huán)才是正確的。

另一個(gè)讓人迷惑的是,do/while循環(huán)中的contiune語(yǔ)句:

do{

continue;

}while(false);

它會(huì)永遠(yuǎn)循環(huán)下去還是只執(zhí)行一次?雖然它只會(huì)循環(huán)一次,但大多數(shù)人都會(huì)想一想。C++的開(kāi)創(chuàng)者Bjarne Stroustrup是這樣說(shuō)的,“do語(yǔ)句是錯(cuò)誤和困惑的來(lái)源,我傾向于將條件放在前面我能看到的地方,避免使用do語(yǔ)句。”

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:周立功:字符能像整數(shù)一樣計(jì)算

文章出處:【微信號(hào):ZLG_zhiyuan,微信公眾號(hào):ZLG致遠(yuǎn)電子】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    程序設(shè)計(jì)基礎(chǔ):字符整數(shù)一樣計(jì)算

    周立功教授數(shù)年之心血之作《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》,電子版已無(wú)償性分享到電子工程師與高校群體,在公眾號(hào)回復(fù)【程序設(shè)計(jì)】即可在線閱讀。書(shū)本內(nèi)容公開(kāi)后,在電子行業(yè)掀起片學(xué)習(xí)熱潮。經(jīng)周立功教授授權(quán),本公眾號(hào)特對(duì)本書(shū)內(nèi)容進(jìn)行連載,愿共勉之。
    的頭像 發(fā)表于 08-29 14:36 ?4554次閱讀

    DSP能ARM一樣跑系統(tǒng)嗎?

    本帖最后由 mr.pengyongche 于 2013-4-30 03:25 編輯 平時(shí)聽(tīng)的太多ARM跑系統(tǒng)了,不知道在DSp上能跑系統(tǒng)不??剛開(kāi)始學(xué)DSP,感覺(jué)上DSP一樣很強(qiáng)大啊,怎么沒(méi)聽(tīng)過(guò)在DSP上跑系統(tǒng)的呢??好希望DSP也能ARM
    發(fā)表于 03-23 13:52

    易語(yǔ)言可以labview一樣簡(jiǎn)單嗎

    labview可以易語(yǔ)言一樣簡(jiǎn)單嗎
    發(fā)表于 08-20 09:36

    allegro能AD一樣打印負(fù)片嗎?

    求教allegro能AD一樣打印負(fù)片嗎?如何操作?
    發(fā)表于 03-29 01:39

    請(qǐng)問(wèn)AD做的原理圖能否ORCAD一樣能加下頁(yè)間符數(shù)字符號(hào)?

    想請(qǐng)教個(gè)問(wèn)題,AD做的原理圖能否orcad一樣能加下頁(yè)間符數(shù)字符號(hào)
    發(fā)表于 09-16 10:27

    LabVIEW是否能C語(yǔ)言一樣

    LabVIEW是否能C語(yǔ)言一樣
    發(fā)表于 09-11 18:41 ?38次下載

    機(jī)器魚(yú)能真魚(yú)一樣游泳

    本周麻省理工學(xué)院的研究人員揭開(kāi)了種看上去魚(yú)一樣游泳的軟體機(jī)器人,他們說(shuō)類(lèi)似的東西可能會(huì)滲透到真正的魚(yú)的學(xué)校,并收集有關(guān)他們行為的數(shù)據(jù)。
    的頭像 發(fā)表于 04-30 05:48 ?3523次閱讀

    如何設(shè)計(jì)線性穩(wěn)壓器一樣簡(jiǎn)單的復(fù)雜開(kāi)關(guān)穩(wěn)壓器

    如何設(shè)計(jì)線性穩(wěn)壓器一樣簡(jiǎn)單的復(fù)雜開(kāi)關(guān)穩(wěn)壓器 - MicroModules_zh
    的頭像 發(fā)表于 08-15 06:02 ?3079次閱讀

    如何使工業(yè)用以太網(wǎng)標(biāo)準(zhǔn)以太網(wǎng)一樣簡(jiǎn)單

    如何使工業(yè)用以太網(wǎng)標(biāo)準(zhǔn)以太網(wǎng)一樣簡(jiǎn)單
    發(fā)表于 11-04 09:51 ?0次下載
    如何使工業(yè)用以太網(wǎng)<b class='flag-5'>像</b>標(biāo)準(zhǔn)以太網(wǎng)<b class='flag-5'>一樣</b>簡(jiǎn)單

    讓洗衣機(jī)蝙蝠一樣會(huì)怎么?用聲音來(lái)提供我們的生活品質(zhì).

    讓洗衣機(jī)蝙蝠一樣會(huì)怎么?用聲音來(lái)提供我們的生活品質(zhì).
    發(fā)表于 11-04 09:51 ?0次下載
    讓洗衣機(jī)<b class='flag-5'>像</b>蝙蝠<b class='flag-5'>一樣</b>會(huì)怎么<b class='flag-5'>樣</b>?用聲音來(lái)提供我們的生活品質(zhì).

    Daniel一樣為您計(jì)算飲料的設(shè)備

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

    DJ一樣控制 NeoPixels

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

    交通燈系統(tǒng)一樣監(jiān)控您的機(jī)器

    交通燈系統(tǒng)一樣監(jiān)控您的機(jī)器
    的頭像 發(fā)表于 03-09 15:16 ?671次閱讀
    <b class='flag-5'>像</b>交通燈系統(tǒng)<b class='flag-5'>一樣</b>監(jiān)控您的機(jī)器

    讓超聲波儀聽(tīng)診器一樣便攜

    讓超聲波儀聽(tīng)診器一樣便攜
    的頭像 發(fā)表于 11-24 16:20 ?867次閱讀
    讓超聲波儀<b class='flag-5'>像</b>聽(tīng)診器<b class='flag-5'>一樣</b>便攜

    如何 awk一樣分割字符

    ' ] 與我預(yù)想的結(jié)果不符,多個(gè)空格會(huì)被分割多次。 那有什么辦法可以達(dá)到 awk 一樣的效果呢? 有兩種方法。 第種方法 不加參數(shù),這
    的頭像 發(fā)表于 11-02 11:14 ?742次閱讀
    如何<b class='flag-5'>像</b> awk<b class='flag-5'>一樣</b>分割<b class='flag-5'>字符</b>串
    主站蜘蛛池模板: 亚洲第一香蕉视频 | 色婷婷色99国产综合精品 | 国产精品虐乳在线播放 | 手机看片久久 | 欧美性生活网站 | 亚洲成人黄色网址 | 精品欧美一区二区三区 | 亚洲成熟| 666精品国产精品亚洲 | 亚洲人成在线精品 | 黄色视屏在线免费播放 | 四虎在线永久 | 黄网在线免费观看 | 特级毛片网站 | 美日韩一区二区 | 最近观看免费高清视频 | 午夜久久久久久 | 男人j进入女人j在线视频 | 人人看人人做人人爱精品 | 美女被网站免费看九色视频 | 福利视频一区二区牛牛 | 国产特黄特色的大片观看免费视频 | 午夜爽爽视频 | 男女交性视频免费视频 | 韩国中文字幕在线观看 | 一级特级女人18毛片免费视频 | 国产网站免费看 | 五月婷婷在线观看视频 | 日韩一级片免费观看 | 人人玩人人弄人人曰 | 国产精品亚洲精品日韩动图 | 免费能看的黄色网址 | bt天堂在线www种子搜索 | 天天操91 | a视频网站 | 国产色网 | 久久夜夜操| 天堂网av2014| 天天av天天翘天天综合网 | 国产免费一区二区三区在线 | 九九精品在线观看 |