| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1015 人关注过本帖, 1 人收藏
标题:[讨论]字符串操作
只看楼主 加入收藏
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏(1)
 问题点数:0 回复次数:6 
[讨论]字符串操作

/****************************************************** 很多人认为C语言中的难点是指针,对指针的理解直接关系到所 编程序的好坏,所以,在这里列举了一些C编译器通常都有的标准 函数的源代码,看过它们,就能对指针和 字符串有所了解了. *******************************************************/ 1. strlen()/*计算字符串长度*/ int strlen(const char string) { int i=0; while(string) i++; return i; } 2. strcpy()/* 字符串拷贝.*/ char *strcpy(char *destination, const char *source) { while(*destinaton++=*source++); return (destination-1); } 3. strcat()/* 字符串的连接.*/ char *strcat(char *target,const char *source) { char *original=target; /* Find the end of the string*/ while(*target) target++; while(*target++=*source++);

return(original); } 4. streql()/*判断两个字符串是否相等.*/ int streql(char *str1,char *str2) { while((*str1==*str2)&&(*str1)) { str1++; str2++; } return((*str1==NULL)&&(*str2==NULL)); } 5. strchr()/*在字符串中查找某个字符.*/ char *strchr(const char *string,int letter) { while((*string!=letter)&(*string)) string++;

return (string); } 6. chrcnt(), 计算某个字符在字符串中出现的次数. int chrcnt(const char *string,int letter) { int count=0; while(*string) { if(*string==letter) count++; }

return count; } 7. strcmp(), 判断两个字符串是否相等. int strcmp(const char *str1,const char *str2) { while((*str1==*str2)&&(*str1)) { str1++; str2++; } if((*str1==*str2)&&(!*str1)) /*Same strings*/ return 0; else if((*str1)&&(!*str2)) /*Same but str1 longer*/ return -1; else if((*str2)&&(!*str1)) /*Same but str2 longer*/ else return((*str1>*str2)?-1:1); } ******************************************************************//

搜索更多相关主题的帖子: 字符 
2004-07-06 14:23
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 
/*以下为我自己仿写的strstr函数*/ /*当然此例程还可以优化,欢迎大家提出改进意见*/ #include<stdio.h> int main(void) { char *str1="mike1"; char *str2="mike"; int pos=0; int my_strstr(char *s,char *t);/*函数声明*/ int next(char *p,int j); /*函数声明*/

pos=my_strstr(str1,str2);

printf("pos=%d\n",pos);

getch(); return 0; }

/*函数功能:模式字符串匹配*/ /*入口参数:s为一给定字符串指针,t模式字符串指针*/ /*出口参数:pos为字符串t在字符串s中的位置。*/ /*若pos为-1则没有找到相匹配的字符串,否则找到*/

int my_strstr(char *s,char *t) { int i=0; /*变量i用于标记指针s_trace从当前位置移到下一位置的长度*/ int j=0; /*变量j作为函数int next(char *p,int j)的参数*/ int pos=0; /*标记模式串t在字符串s的位置*/

char *s_save=s;/*指针s_save用于保存字符串s的首地址*/ char *t_save=t;/*指针t_save用于保存字符串t的首地址*/ char *s_trace=s;/*指针s_trace用于跟踪和初始化指针s*/

while((*s)!='\0') { while((*t)!='\0') { if((*s)==(*t)) { t++; s++; } else break; }

if(*t=='\0') { return pos; /*匹配成功,返回*/ } else { j=s-s_trace-1;/*计算s指针相对于s_trace指针的距离*/

if(s==s_trace) { i+=1;/*在每一次匹配时若第一次不匹配,则步长为1*/ } else /*否则调用函数next()确定下一次的s_trace值*/ { i=next(t_save,j);/*函数调用*/ } /*进入下一次匹配*/ s_trace=s_trace+i; /*根据变量i调整s_trace指针*/ s=s_trace; /*重新初始化s指针*/ t=t_save; /*调整指针t,使它重新指向开始位置*/ pos=s_trace-s_save;/*根据偏移量赋值*/ i=0; /*重新初始化i*/ }

}

return -1; }

/*函数功能:确定字符串t从当前位置向后滑动多远的距离*/ /*入口参数:p即为模式串t的首地址;j为从s_trace到s的距离*/ /*出口参数:j即为字符串t从当前位置向后滑动多远的距离*/ int next(char *p,int j) { int i=0;/*用于控制循环*/ char *p_save=p; char *p1_trace=(p+1);/*p1_trace跟踪每一次p1的初值,并在下一次为p1赋初值*/ char *p1=p1_trace;

while(i<=j) { while(*p==*p1) { p1++; p++; } if(p1>(p_save+j)) { j=p1_trace-p_save;/*查找到下一个位置,返回*/ return j; } else /*否则,重新初始化p1_trace,p1,p进入下一次匹配*/ { p1_trace++; p1=p1_trace; p=p_save; } i++; }

/*没有查找到,返回j+1,即从传入的j位置之后在strstr函数中进行下一次匹配*/ j++; return j;

} 帮忙改进改进!

2004-07-06 14:24
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 

粗看了一下:

/*以下为我自己仿写的strstr函数*/ /*当然此例程还可以优化,欢迎大家提出改进意见*/ #include<stdio.h> int main(void) { char *str1="eerytytuyumkeiakbcdke1"; char *str2="cdk"; int pos=0; int my_strstr(char *s,char *t);/*函数声明*/ int next(char *p,int j); /*函数声明*/

pos=my_strstr(str1,str2);

printf("pos=%d\n",pos);

getch(); return 0; }

/*函数功能:模式字符串匹配*/ /*入口参数:s为一给定字符串指针,t模式字符串指针*/ /*出口参数:pos为字符串t在字符串s中的位置。*/ /*若pos为-1则没有找到相匹配的字符串,否则找到*/

int my_strstr(char *s,char *t) { int i=0; /*变量i用于标记指针s_trace从当前位置移到下一位置的长度*/ int j=0; /*变量j作为函数int next(char *p,int j)的参数*/ int pos=0; /*标记模式串t在字符串s的位置*/

char *s_save=s;/*指针s_save用于保存字符串s的首地址*/ char *t_save=t;/*指针t_save用于保存字符串t的首地址*/ char *s_trace=s;/*指针s_trace用于跟踪和初始化指针s*/

while((*s)!='\0') { while((*t)!='\0') { if((*s)==(*t)) { t++; s++; } else break; }

if(*t=='\0') { return pos; /*匹配成功,返回*/ } else { j=s-s_trace-1;/*计算s指针相对于s_trace指针的距离*/

/*问题一,这个j有必要吗? */

if(s==s_trace) { i+=1;/*在每一次匹配时若第一次不匹配,则步 长为1*/

} else /*否则调用函数next()确定下一次 的s_trace值*/ { i=next(t_save,j);/*函数调用*/

/*问题二,这个if的处理有问题,原因就是后面 有s=s_trace; */ } /*进入下一次匹配*/ s_trace=s_trace+i; /*根据变量i调整s_trace指针*/ s=s_trace; /*重新初始化s指针*/ t=t_save; /*调整指针t,使它重新指向开始位置*/ pos=s_trace-s_save;/*根据偏移量赋值*/ i=0; /*重新初始化i*/ }

}

return -1; }

/*函数功能:确定字符串t从当前位置向后滑动多远的距离*/ /*入口参数:p即为模式串t的首地址;j为从s_trace到s的距离*/ /*出口参数:j即为字符串t从当前位置向后滑动多远的距离*/ int next(char *p,int j) { int i=0;/*用于控制循环*/ char *p_save=p; char *p1_trace=(p+1);/*p1_trace跟踪每一次p1的初值,并在下一次 为p1赋初值*/ char *p1=p1_trace;

while(i<=j) { while(*p==*p1) { p1++; p++; } if(p1>(p_save+j)) { j=p1_trace-p_save;/*查找到下一个位置,返回*/ return j; } else /*否则,重新初始化p1_trace,p1,p 进入下一次匹配*/ { p1_trace++; p1=p1_trace; p=p_save; } i++; }

/*没有查找到,返回j+1,即从传入的j位置之后在strstr函数中 进行下一次匹配*/ j++; return j;

}

还有就是写得太累赘了。


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-07-06 15:08
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 

谢谢!

我会考虑优化的!

当然从程序来讲,此程序能够完成所需功能!我验证过!

2004-07-06 17:13
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 

你可能还是没有明白我的意思,你在我所就的地方加上printf,把这几个变量打印出来,你知道问题是什么了。

再看看这样,你编译运行一下:

/*以下为我自己仿写的strstr函数*/ /*当然此例程还可以优化,欢迎大家提出改进意见*/ #include<stdio.h> int main(void) { char *str1="qwemike1"; char *str2="mike"; int pos=0; int my_strstr(char *s,char *t);/*函数声明*/ int next(char *p,int j); /*函数声明*/

pos=my_strstr(str1,str2);

printf("pos=%d\n",pos);

getch(); return 0; }

/*函数功能:模式字符串匹配*/ /*入口参数:s为一给定字符串指针,t模式字符串指针*/ /*出口参数:pos为字符串t在字符串s中的位置。*/ /*若pos为-1则没有找到相匹配的字符串,否则找到*/

int my_strstr(char *s,char *t) { int i=0; /*变量i用于标记指针s_trace从当前位置移到下一位置的长度*/ int j=0; /*变量j作为函数int next(char *p,int j)的参数*/ int pos=0; /*标记模式串t在字符串s的位置*/

char *s_save=s;/*指针s_save用于保存字符串s的首地址*/ char *t_save=t;/*指针t_save用于保存字符串t的首地址*/ char *s_trace=s;/*指针s_trace用于跟踪和初始化指针s*/

while((*s)!='\0') { while((*t)!='\0') { if((*s)==(*t)) { t++; s++; } else break; }

if(*t=='\0') { return pos; /*匹配成功,返回*/ } else { j=s-s_trace-1;/*计算s指针相对于s_trace指针的距离*/

if(s==s_trace) { i+=1;/*在每一次匹配时若第一次不匹配,则步长为1*/ } else /*否则调用函数next()确定下一次的s_trace值*/ { i=next(t_save,j);/*函数调用*/ } /*进入下一次匹配*/ s_trace=s_trace+i; /*根据变量i调整s_trace指针*/ s=s_trace; /*重新初始化s指针*/ t=t_save; /*调整指针t,使它重新指向开始位置*/ pos=s_trace-s_save;/*根据偏移量赋值*/ i=0; /*重新初始化i*/ }

}

return -1; }

/*函数功能:确定字符串t从当前位置向后滑动多远的距离*/ /*入口参数:p即为模式串t的首地址;j为从s_trace到s的距离*/ /*出口参数:j即为字符串t从当前位置向后滑动多远的距离*/ int next(char *p,int j) { return 0;//把这个函数内容去掉 }

[此贴子已经被作者于2004-07-06 17:35:26编辑过]


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-07-06 17:18
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
收藏
得分:0 

这是我刚写的,没有仔细调试。

/*在串字符string中查找字符串str,若有则返回str在string中第几位开始

首字符计为0,若无,则返回-1*/

int fun(char *string,char *str) { char *ptr,*ptr1; int t=0; while(*string) { ptr1=string; ptr=str; while(*ptr)if(*ptr==*ptr1)ptr++,ptr1++; else break; if(*ptr)string++,t++; else return t; } return -1; }


九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2004-07-06 17:33
mikewolf
Rank: 1
等 级:新手上路
帖 子:175
专家分:0
注 册:2004-7-3
收藏
得分:0 

其实这里设计到实用范围的问题,如果在两个字符串中涉及到大量的相同元素,如两个字符串中均只含有1和0;另外,在具有大量从外设输入数据时,尽量不回朔指针,而采用模式字符串的匹配(只改变下标,确定向后滑动的距离),那么我的方法要好一些(这是从数据结构中看到的)。

如果在字符串中,含有很多不相同的元素,如汉字或英文,那么你的方法要好一些。

这取决于具体的应用。

2004-07-07 20:16
快速回复:[讨论]字符串操作
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013929 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved