- 1、本文档共13页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
字符串处理中的常见问题
字符串处理中的常见问题
——王炳华
在C语言中字符串处理方面的问题非常普遍,常见问题如:查找、替换、复制、移动、插入、删除、排序、连接、打印图案、单词统计、字符串类型与其他类型(整型、实型、长整型)之间的相互转换等。
由于在C语言中只有字符变量,没有字符串变量,字符串的存储是用字符数组实现的。同时由于在处理字符串时使用指针比较方便,因此在一些C语言考试中,常常把对数组和对指针方面的考查用字符串作为对象,使得这方面的考题也就比较多。
在各种C语言的编译软件中都提供了很多字符串处理函数。它们的源代码在string.h头文件中,在编程中可以尽量利用这些函数,如果使用了这些函数一定要包含string.h头文件。但是在有些考题中常常给出不得使用库函数的限制。因此在下面的例题中尽可能照顾到这个情况。
查找
查找本身是一种基本算法,同时它也常常是其他一些算法的先行步骤。C语言提供了几个用于查找的函数,如:int strcmp(char *,char *)、int strncmp(char *,char *,int)、char * strstr(char *,char *)、char * strchr(char *,char)等。
从键盘上读入一批单词,统计其中单词”good’出现的个数。代码如下:
#include stdio.h
#include string.h
void main()
{ char c1[80],c2[]=good ,*p1=c1,*p2=c2;
int n=0; //作记数器使用
gets(p1);
//在p 1指针后移的过程中,它所指的尾子串越来越/短,若其长度=p2指针所指的串的长度就有可能还有c2串。所以用strlen(p1)=strlen(p2)作为下面查找循环执行的条件。
for(;strlen(p1)=strlen(p2);p1++)
if(!strncmp(p1,p2,strlen(p2))) n++; // strncmp(p1,p2,strlen(p2))==0是找到了,n增1
printf(%d\n,n);
}
如果用char * strstr(char *,char *)函数,可将代码改写如下:
#include stdio.h
#include string.h
void main()
{ char c1[80],c2[]=good ,*p1=c1,*p2=c2;
int n=0;
gets(p1);
for(;strlen(p1)=strlen(p2);p1++)
if(p1=strstr(p1,p2)) n++; //(strstr(p1,p2)!==NULL是找到了,就
printf(%d\n,n); //把指针移动到找到的地方,可以大大地提高执行效率
}
这个代码比前一个代码的执行效率高。前者指针是每次移动一个字符。循环体需要执行strlen(p1)=strlen(p2)次。后者是执行一次循环就找到一个good (如果有的话),找到之后指针一下就可以移动到’g’字母后的’o’字母上,下次循环是从这里开始去找下一个good ,这样循环体就少执行了(最后一个good 前的字符个数 - good 单词的总个数)次。
如果不准使用char * strstr(char *,char *)函数,可以自己编写一个。见下面的例题和代码。
例1_2. 编写一个函数实现将在第一个串中查找第二个串,若找到就返回在第一个串中首次出现第二个串的起始地址,若找不到就返回NULL。函数的原型为char *mystrstr(str1 *, str2 *);在主函数中读入两个串,调用该函数在第一个串中查找第二个串,输出找到处开始后面的串。代码如下:
#include stdio.h
#include string.h
void main()
{ char str1[80],*ps1=str1;
char str2[20],*ps2=str2,*p;
char *mystrstr(char *, char *);
gets(str1);
gets(str2);
p=mystrstr(ps1,ps2);
puts(p);
}
char *mystrstr(char *p1, char *p2)
{ int n;
char *pp1=p1,*pc1,*pc2;
n=strlen(p2);
for(;strlen(pp1)=n;pp1++)
if(*pp1==*p2) //当发现p2串的首字符与pp1所指的字符相同时,就在下面的循
{ for(pc1=
文档评论(0)