还剩6页未读,继续阅读
文本内容:
8第章字符串处理第一单元学习指南本章教学目标掌握如何利用字符数组存储、引用和处理字符串,以及如何利用字符指针引用和处理字符串
1.掌握统计字符个数、统计单词个数等典型算法
2.学会编写一般难度的用字符数组或字符指针进行字符串处理的程序,并能上机调试运行
3.学习方法建议.仔细阅读本章示例程序,正确理解每条语句的功能,着重理解字符数组元素值包括直接引用1和间接引用方式的变化过程;着手编写一般难度的字符串处理程序上机调试运行本章示例程序,并调试运行自己编写的程序,进一步体会字符串处理程序的功2,能对于语法错误,采取与前面相同的应对措施避免对字符数组名进行赋值,例如
3.chara[1001=Hello!,b[1001;b=a;o对于运行错误着重检查是否通过字符指针变量进行字符串的输入例如
4.char*p;getsp;对于逻辑错误,着重检查循环中对字符数组元素的处理是否正确仍然可以采用在程序中添
5.加临时性输出语句的方法,进行出错位置的定位记录总结在调试程序的过程中发现的错误以及改正的方法,不断积累编写字符串处理程序的
6.直接经验第二单元重点与难点解析语言中有字符串数据类型吗?
1.C语言的数据类型中没有字符串类型,所以也就没有字符串变量的概念语言中用字符C C类型的数组来进行字符串处理语言可以处理中文字符串吗?
2.C可以处理中文字符串需要注意的是一个汉字要占多个字节在和Windows xpWindows7系统中文默认采用编码则一个汉字占用个字节而在系统下,中文默认采用编gbk2Linux UTF-8码,则一个中文占个字节3例如#include stdio.h#include Hstring.hH intmainvoid〃定义一个长度为的字符数组100char str
[100];〃任意输入一个长度小于的字符串100scanf%s,str;〃输出字符串及字符串的长度printfH%s:%d\n\str,strlenstr;上述代码在系统下运行,如果从键盘上输入“山东理工大学”,则输出结果为“山东win7理工大学12”字符串的结束标志为,\,还是
3.o在语言中,作为字符串的结束标志,地是等价的因为字符对应的码值为C0ASCII0o
4.已知str是字符数组名,则scanfu%sH,str和getsstr有什么区别?头文件中的函数中使用%接收字符串时,遇到空格、制表符、回车符都表示stdio.h scanfs结束,而头文件中的函数仅以回车作为输入结束string.h gets
5.已知str是字符数组名,则printfn%sH,str和putsstr有什么区别putsstr屏幕上显示字符串str并且结束后自动换行,等价于printfC,%s\nH,stro字符数组越界访问能编译通过吗?
6.字符数组越界访问编译可以通过,不会报错,但运行时,会出现问题字符数组和字符指针有什么区别呢?
7.char str[]=abc”char*p=abc”首先,在内存的中位置不同,字符数组保存的字符串存放在内存的栈中,而字符指针指向的字符串保存在内存的静态存储区中其次,字符数组保存的字符串属于变量,可以被修改,而字符指针指向的字符串是属于常量,不能被修改字符指针是不是和字符数组名都是指针常量呢?
8.字符指针是变量,可以改变它的指向可以将一个字符指针指向一个字符串常量后又指向另外一个字符串常量在为初始化之前,字符指针是一个未定义的值,所以在使用字符指针时一定要注意初始化第三单元典型错误解析定义字符数组长度不足
1.因为字符串的末尾隐含一个字符,故相应字符数组的长度至少要比字符串中字符的个数多“\0”lo例如char a
[5]=nHellon;是错误的正确的写法应该是char a
[6]=nHellon;也可以写作char a[]=nHellon;用输入字符串时调用格式错误
2.scanf用函数输入字符串时,使用%格式符,此时的输入项应为数组名例如scanf schar a
[30];scanf%sn,a;是错误的正确的写法应该是char a
[30];,scanf%s a;因为数组名本身就是一个地址,故不需要取地址运算符用输出字符串时调用格式错误
3.printf用函数输出字符串时,使用%格式符,此时的输出项应为数组名例如printf schar a
[30]=nHello World;,printf%s a
[30];是错误的因为此处的看作是一个数组元素(当然其下标已越界),故与格式符%不匹配a
[30]s正确的写法应该是char a
[30]=nHello World;printfn%sn,a;字符串赋值错误
4.不能通过整体赋值将一个字符串存入到一个字符数组中例如char a
[30],b
[30]=nHello World0;a=b;或者a=nHello World;都是错误的因为数组名是地址常量,故不能对其进行赋值正确的写法应该是achar a
[30],b
[30]=nHello World;strcpya,b;也可以用循环实现逐个字符复制例如char a
[30]b
[30]=nHello World;int i;Afori=0;a[i]!=\0;i++a[i]=b[i];a[i]=,\0,;或者char a
[30],b
[30]=nHello World;int i;for i=0;i=strlenb;i++a[i]=b[i];字符串比较错误
5.不能通过关系运算符对两个字符串直接进行比较大小例如char a
[30]=nabcd,b
[30]=,,abdcn;ifabputs a;elseputsb;或者ifnabcdnabdcnputs a;elseputs b;都是错误的因为数组名是地址常量,故只是比较数组和数组的首地址的大小而ab ab〉“则是比较字符串“和字符串“的首地址大小正确的写法应该是“abcd”abdc”abed”abdc”ifstrempa,b0puts a;elseputsb;函数调用格式错误
6.gets一个函数只能输入一个字符串,且函数的参数中不需要格式字符例如gets getschar a
[80],b
[80],c
[80];getsa,b,c;或者%,gets”s%s%s”a,b,c;都是错误的正确的写法应该是chara
[80],b
[80]c
[80];zgets a;gets b;gets c;用字符型指针变量输入字符串
7.从键盘输入字符串时,应首先开辟足够的内存空间通常通过定义字符数组实现来存放字符串若直接用字符型指针变量输入字符串,则有可能造成内存数据的破坏例如char*p;/*或scanf n%sn,p;getsp;*/是不安全的,有可能造成内存数据的破坏正确的写法应该是chara
[100];/*或scanf n%sn,a;gets p;*/也可以写作chara
[100]*p;rp=a;scanfn%sM,p;/*或getsp;*/。
个人认证
优秀文档
获得点赞 0