指针与字符串.docx_第1页
指针与字符串.docx_第2页
指针与字符串.docx_第3页
指针与字符串.docx_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

8.5指针和字符串在数组一章,我们讲过可以用字符数组存放字符串。与其他类型的数组不同,存放字符串的字符数组在初始化时,系统会自动接一个0到字符串的末尾,例如:main()char str=ABC;printf(%s,str);程序运行的结果为:ABC在字符数组str初始化时,系统将字符A赋给str0,B赋给str1,C赋给str2,并自动将字符串结束符0赋给str3。调用printf函数输出时,传递的实际参数是数组名称,也就是数组的首地址。printf函数的实现部分将根据该指针依次搜索字符串的字符,直到字符串结束符0为止。我们也可以用指针变量来处理:main()char str=ABC, *p=str;int i;printf(n1: ); printf(%s,p); /*代码段1*/printf(n2: ); puts(p); /*代码段2*/printf(3: ); for(i=0;*(p+i)!=0;i+) /*代码段3*/printf(%c, *(p+i);printf(n4: ); for(i=0;*p!=0;i+,p+) /*代码段4*/printf(%c, *p);程序运行的结果为:1: ABC2: ABC3: ABC4: ABC指针变量p在定义时,被初始化指向字符数组str的首地址。在代码段1中,p作为printf的实际参数,同传入数组名称的效果是一样的。代码段2使用了puts函数进行输出。代码段3利用了指针变量p和字符串结束符0,逐个将字符串里的字符输出。代码段4和代码段3类似,不同的是指针变量p的值在循环中变化,每次*p指向不同的数组元素。C语言中,字符常量是按照字符数组来处理的,也就是说,如果程序中有一个字符串常量,系统会自动在内存中创建一个字符数组,将字符串的内容保存在字符数组中,并加字符串结束符0。因此,下面的程序是合法的,输出字符串的内容:main()char *p=ABC;printf(%s,p);上面程序中的char *p=ABC;不能理解为“将字符串赋给指针变量p”,应该理解为:(1) 定义了一个指向char型变量的指针变量p;(2) 系统自动在内存中创建一个4个元素的字符数组,前三个元素存放字符A,B,C,最后一位存放字符串结束符0;(3) 将字符数组的首地址赋给指针变量p。上述的程序也可以改写为:main()char *p;p=ABC;printf(%s,p);在函数的执行部分,不能将字符串直接赋值给字符数组。下面是一个错误的例子:main()char str100;str=ABC; /*错误的赋值*/printf(%s,str);这里str是字符数组首地址常量,不能被赋值。提示: 进行字符串操作时,一定要保证字符数组是存在的。下面的程序是错误的:main()char str=hello, *p;strcpy(p,str);printf(%s,p);p是未经赋值的指针变量,p本身的值是随机值。strcpy将把字符串拷贝到p开始的内存中。这种操作很危险,可能导致异常。正确的方法是:p应该指向一个实实在在的字符数组。从上述的例子可以看出,指向字符串的指针实际上是指向字符数组的指针,它属于指向一维数组的指针的一个特例。在处理指向字符数组的指针时,只要注意处理字符串结束符0就可以了。例 8-3 编写程序实现strcat的功能,即将两个字符串连接起来。首先可以定义两个字符数组,接受用户输入的字符串;同时定义两个指针p1和p2,分别指向两个字符数组的首地址。可以利用循环依次向前拨动p1,直到*p1是字符串结束符为止。这样p1就指向了字符串1的末尾。然后再使用一个循环,依次将*p2复制到*p1,直到*p2是字符串结束符为止。这样就把字符串2连接到字符串1后。最后要保证连接后的字符串1一定要有字符串结束符。main()char s1100,s2100,*p1,*p2;p1=s1;p2=s2;/*输入字符串s1和s2*/printf(nInput first string: );gets(s1);printf(Input second string: );gets(s2);/*将p1拨到s1的末尾*/while(*p1)p1+;/*将s2的内容接到s1后面*/while(*p1+=*p2+);/*输出连接后的内容*/printf(Catenated string: %s,s1);程序运行的结果为:Input first string: brainInput second string: stormCatenated string: brainstorm程序中,先用了一个while循环,将指针p1拨到s1的末尾。循环结束后,p1指向s1的字符串结束符0。语句while(*p1+=*p2+)是一个比较简练的语句。该while语句没有执行语句(注意该语句后面一定要有分号),字符连接功能是利用一个赋值表达式进行的。循环每次检查表达式时,先将*p2的内容赋值给*p1,然后p2和p1分别自加。赋值后的*p2就是表达式的值。注意这个循环拷贝了s2里的字符串结束符。最后一次检查表达式时,先将0拷贝到*p2,然后表达式为假,循环结束。例 8-4 输入一行句子,统计单词的个数(包括单词间有多个空格的情况)。本题有多种解法。这里我们用拨动指针的方法实现。具体算法是:从头开始检查字符数组的每个字符,如果是空格则将指针拨到下一个字符,略过这个空格,继续上面的过程;如果不是空格,则探索下一个空格的位置(当前位置到下一个空格之间是一个单词),将指针拨到下一个空格处,同时单词数加一,继续检查后续的字符。main()char str100,*p;int i,nCount=0;p=str;/*输入句子*/printf(nPlease input the sentence: n);gets(str);/*统计单词的个数*/while(*p!=0)/*用指针变量p遍历字符数组的每个元素*/if(*p= )/*如果该元素是空格则跳过,继续循环*/p+;continue;else/*如果不是空格,单词数加一*/nCount+;/*如果后续还有字符,说明是一个单词;一并跳过*/i=0; /*不要忘记位置清零*/*某个位置为空格或字符串结束符时跳出循环*/while(*(p+i)!= &*(p+i)!=0) i+;p+=i;/*输出结果*

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论