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