C语言中字符数据的输入与输出问题解析
2015-02-04黄述杰
随着单片机技术的飞速发展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