隨著單片機(jī)技術(shù)的飛速發(fā)展C語(yǔ)言逐步成為單片機(jī)編程的重要語(yǔ)言,C 語(yǔ)言程序設(shè)計(jì)課程不僅是高校計(jì)算機(jī)專(zhuān)業(yè)必修課,也成為電子相關(guān)專(zhuān)業(yè)的一門(mén)重要的專(zhuān)業(yè)基礎(chǔ)課程,在學(xué)習(xí)過(guò)程中C語(yǔ)言字符數(shù)據(jù)的輸入與輸出是教學(xué)的難點(diǎn)與重點(diǎn)之一,也是學(xué)生容易出錯(cuò)的知識(shí)點(diǎn)。通過(guò)教學(xué)實(shí)例重點(diǎn)分析C語(yǔ)言字符數(shù)據(jù)輸入與輸出易出錯(cuò)原因,提出解決辦法,使教學(xué)更具針對(duì)性,有效提高課堂教學(xué)質(zhì)量。
【關(guān)鍵詞】單片機(jī) C語(yǔ)言 字符數(shù)據(jù) 輸入 輸出
C 語(yǔ)言是一種通用、靈活、結(jié)構(gòu)化的計(jì)算機(jī)高級(jí)語(yǔ)言,能實(shí)現(xiàn)匯編語(yǔ)言的大部分功能,直接對(duì)硬件進(jìn)行訪問(wèn),用C語(yǔ)言編寫(xiě)的程序,其生成的目標(biāo)代碼質(zhì)量高、運(yùn)行效率高,故而在單片機(jī)編程中被廣泛應(yīng)用,因此C語(yǔ)言程序設(shè)計(jì)課程不僅是高校計(jì)算機(jī)專(zhuān)業(yè)必修課,也成為電子相關(guān)專(zhuān)業(yè)的一門(mén)重要的專(zhuān)業(yè)基礎(chǔ)課程。C 語(yǔ)言學(xué)習(xí)中字符數(shù)據(jù)的定義分為單字符和多字符兩類(lèi),而具體應(yīng)用必須與數(shù)組結(jié)合,對(duì)初學(xué)者的學(xué)習(xí)造成困難,特別是字符型數(shù)據(jù)的輸入與輸出問(wèn)題較多,是教學(xué)的難點(diǎn)與重點(diǎn)。通過(guò)教學(xué)實(shí)例重點(diǎn)分析C語(yǔ)言字符數(shù)據(jù)輸入與輸出易出錯(cuò)原因,解決C 語(yǔ)言中學(xué)習(xí)中字符型數(shù)據(jù)輸入與輸出過(guò)程中常見(jiàn)的問(wèn)題。
1 C語(yǔ)言字符數(shù)據(jù)的基本概念
1.1 字符常量和字符變量
C 語(yǔ)言有豐富的數(shù)據(jù)類(lèi)型,包括基本類(lèi)型、構(gòu)造類(lèi)型、指針類(lèi)型和空類(lèi)型,其中基本類(lèi)型中包含有字符型數(shù)據(jù)。字符型數(shù)據(jù)分常量和變量,字符常量是由單引號(hào)括起來(lái)的ASCII字符,如a。字符變量必須先定義后使用,如char c1;即定義了一個(gè)字符變量c1。字符型變量可以用來(lái)存放字符常量,且它只能存放一個(gè)字符,如c1=a;。
1.2 字符串常量
C 語(yǔ)言中,字符串常量是由一對(duì)雙引號(hào)” ” 引起來(lái)的字符序列,如”Intel”、“The C Program Language ”。C 語(yǔ)言中字符串一一位數(shù)組的形式存放在內(nèi)存中,因此A和“A”所表達(dá)的意義不同,‘A是單字符常量,在內(nèi)存中只占1個(gè)字節(jié),存放字符A的ASCII碼,“A”是字符串常量,在內(nèi)存中共占2個(gè)字節(jié),其中一個(gè)字節(jié)存放A字符的ASCII碼,另一個(gè)字節(jié)自動(dòng)存放字符串結(jié)束標(biāo)記“\0” 。
1.3 字符數(shù)組
C 語(yǔ)言中只有字符串常量而沒(méi)有字符串變量,字符串的存取操作必需借助字符數(shù)組來(lái)實(shí)現(xiàn),而不能以變量的形式直接進(jìn)行存取,存放一個(gè)字符串需要先定義一個(gè)字符型數(shù)組,而后將字符串中的字符逐個(gè)作為字符數(shù)組的數(shù)組元素進(jìn)行操作。字符數(shù)組中一個(gè)元素只能存放一個(gè)字符,如 char a:表示定義了一個(gè)一維字符數(shù)組a,可存放5個(gè)字符,或存放最大長(zhǎng)度為4的1個(gè)字符串(最后一個(gè)字符是字符串結(jié)束符‘\0)。字符數(shù)組元素的引用通常采用循環(huán)結(jié)構(gòu)實(shí)現(xiàn)對(duì)數(shù)組元素的逐個(gè)操作。字符數(shù)組的初始化分為逐個(gè)字符給數(shù)組元素賦值和用字符串常量給字符數(shù)組初始化兩種形式,由于逐個(gè)字符給數(shù)組元素賦值操作繁瑣,實(shí)際編程中常用字符串常量給字符數(shù)組初始化。
2 字符數(shù)據(jù)的輸入與輸出
C語(yǔ)言提供了字符數(shù)據(jù)的輸入與輸出除了C語(yǔ)言提供的常用scanf()函數(shù)和printf()函數(shù)進(jìn)行輸入與輸出操作,還提供了專(zhuān)用的字符輸入函數(shù)getchar()和字符輸出函數(shù)putchar()以及字符串輸入函數(shù)gets()和字符串輸出函數(shù)puts()。
2.1 字符數(shù)據(jù)的輸入
2.1.1 scanf 函數(shù)
scanf 函數(shù)的作用是輸入若干個(gè)任意類(lèi)型的數(shù)據(jù),是一種格式輸入函數(shù),利用scanf函數(shù)給字符變量賦值應(yīng)使用格式說(shuō)明“%c”即可實(shí)現(xiàn)字符輸入。用 scanf 函數(shù)輸入其他類(lèi)型的數(shù)據(jù)時(shí),數(shù)據(jù)間可以用空格來(lái)分隔,而用回車(chē)表示輸入結(jié)束,但用“%c”格式輸入字符時(shí),空格和“轉(zhuǎn)義字符”都會(huì)作為有效字符輸入,因此使用時(shí)容易出錯(cuò)。例如:scanf“(%c%c%c”,&c1,&c2,&c3);若要將字符a、b、c分別賦給變量c1、c2、c3,正確的輸入方法是“abc”,如果輸入“a空格b空格 c”,則c1=a,c2=空格,c3=b,將產(chǎn)生錯(cuò)誤。在連續(xù)使用兩個(gè)及以上scanf 函數(shù)輸入字符數(shù)據(jù)時(shí)最容易出現(xiàn)問(wèn)題,有下列程序:
printf("輸入兩個(gè)整數(shù):"); scanf("%d%d",&a,&b);
printf("輸入兩個(gè)字符:"); scanf("%c%c",&c1,&c2);
運(yùn)行程序輸入“5 空格8 HE”,結(jié)果是:a=5,b=8,c1=\n,c2=H,將產(chǎn)生錯(cuò)誤,出現(xiàn)這種情況的原因是輸入的第一個(gè)回車(chē)表示輸入結(jié)束,但該回車(chē)被下一個(gè)scanf函數(shù)的第一個(gè)變量c1接收而成為換行符\n,而字符H賦給了變量c2,輸入的字符E未被任何變量接收。解決此問(wèn)題的辦法是在第二個(gè)scanf函數(shù)的格式控制部分第一個(gè)“%c”前加一個(gè)空格,這樣在輸入時(shí)第一個(gè)回車(chē)就不會(huì)被變量c1接收了,問(wèn)題得到解決。
2.1.2 getchar 函數(shù)
getchar 函數(shù)的作用是從終端(通常是鍵盤(pán))輸入一個(gè)字符,其函數(shù)值就是從鍵盤(pán)輸入的字符,可將函數(shù)值賦給字符變量,如:char c1;c1=getchar();程序運(yùn)行到getchar函數(shù)時(shí),等待用戶(hù)從鍵盤(pán)輸入字符,在鍵盤(pán)上輸入“a”,則c1=a。若是兩個(gè)變量輸入,程序如下:char c1,c2;c1=getchar();c2=getchar();想得到 c 1 = a ,c 2 = b ,程序運(yùn)行后輸入‘a(chǎn) ‘后輸入就會(huì)結(jié)束,第二個(gè)字符b‘無(wú)法輸入,而此時(shí) c1=a,c2=\n。正確的輸入方法是在鍵盤(pán)上輸入“ab”,此時(shí)c1=a,c2=b。由此可以得出,在使用getchar進(jìn)行字符輸入時(shí),按回車(chē)鍵表示輸入結(jié)束,但同時(shí)按回車(chē)鍵也產(chǎn)生一個(gè)轉(zhuǎn)義字符\n,這個(gè)字符會(huì)被后面的 getchar 函數(shù)接收,因此利用連續(xù)多個(gè)getchar ()函數(shù)給多個(gè)字符變量賦值時(shí)應(yīng)注意只在最后一個(gè)字符后面按回車(chē)鍵,其它字符連續(xù)輸入,字符間不要添加任何符號(hào),否則會(huì)產(chǎn)生錯(cuò)誤。endprint
2.1.3 gets()函數(shù)
gets()函數(shù)的作用是從終端輸入一個(gè)字符串到字符數(shù)組中。如:char str1[13];gets(str);從鍵盤(pán)輸入“How are you? ”,則數(shù)組 str1 的值為字符串“How are you?”。輸入時(shí)以回車(chē)表示輸入結(jié)束,這與 scanf 函數(shù)一致,但需要注意的是利用gets 函數(shù)輸入字符串時(shí),輸入結(jié)束時(shí)所按的回車(chē)鍵會(huì)被轉(zhuǎn)化為字符串結(jié)束標(biāo)志\0,而利用 scanf 函數(shù)輸入字符串時(shí)回車(chē)不會(huì)被轉(zhuǎn)化為\ 0 。
2.2 字符數(shù)據(jù)的輸出
2.2.1 printf()函數(shù)
printf()函數(shù)的作用是輸出若干個(gè)任意類(lèi)型的數(shù)據(jù),對(duì)不同類(lèi)型的數(shù)據(jù)用不同的格式字符。d格式符以十進(jìn)制整數(shù)形式輸出、x格式符以十六進(jìn)制數(shù)形式輸出整數(shù)、c格式符以單個(gè)字符形式輸出、s格式符以字符串形式輸出、f格式符以小數(shù)形式輸出實(shí)數(shù)。printf()函數(shù)輸出時(shí)還可以在符號(hào)前面以m.n的形式控制數(shù)據(jù)顯示的列數(shù)和精度。
2.2.2 putchar()函數(shù)
putchar() 函數(shù)的作用是向終端輸出一個(gè)字符,字符內(nèi)容可以是單字符常量、字符變量、ASCII碼和轉(zhuǎn)義字符。如:putchar (‘h)、putchar(c1)、putchar (65)、putchar (‘\n)將分別輸出單字符h、字符變量c1、字符A和換行符。
2.2.3 puts() 函數(shù)
p u t s 函數(shù)的作用是將一個(gè)字符串(以\ 0 結(jié)束的字符序列)輸出到終端,在輸出時(shí)將字符串結(jié)束標(biāo)志\ 0 轉(zhuǎn)換成\ n ,即輸出完字符串后換行,而用 printf 函數(shù)的“%s”格式輸出字符串時(shí)不會(huì)將字符串結(jié)束標(biāo)志\ 0 轉(zhuǎn)換成\ n ,如果需要換行必須書(shū)寫(xiě)語(yǔ)句 printf (“\n”)來(lái)實(shí)現(xiàn)。
3 結(jié)束語(yǔ)
在C語(yǔ)言程序設(shè)計(jì)中數(shù)據(jù)的輸入與輸出是最為常用的操作,而字符數(shù)據(jù)因其自身的特點(diǎn)在輸入輸出方面又具有一定的特殊性,一般情況下,scanf()和printf()、getchar()和putchar()、gets()和puts()配對(duì)使用,在學(xué)習(xí)過(guò)程中必須多實(shí)踐,多練習(xí),在實(shí)際編程過(guò)程中掌握有關(guān)字符數(shù)據(jù)輸入與輸出的方法,進(jìn)而提高編程能力,掌握C語(yǔ)言程序設(shè)計(jì)的技巧。
參考文獻(xiàn)
[1]譚浩強(qiáng).C程序設(shè)計(jì)試題匯編[M].北京:清華大學(xué)出版社,1998.
[2]葛素娟,胡建宏.C語(yǔ)言程序設(shè)計(jì)教程[M].北京:機(jī)械工業(yè)出版社,2013:41-47.
[3]崔琦.淺議C語(yǔ)言中字符數(shù)據(jù)的輸入與輸出[J].中國(guó)科技信息,2009(14):118.
作者簡(jiǎn)介
黃述杰(1980-),男,碩士學(xué)位?,F(xiàn)為武威職業(yè)學(xué)院講師。研究方向?yàn)檐浖こ獭?/p>
作者單位
武威職業(yè)學(xué)院 甘肅省武威市 733000endprint