Posted on 2008-06-03 17:06
路缘 阅读(1221)
评论(0) 编辑 收藏 引用 所属分类:
C/C++
今天看《C和指针》一书的第6章指针,碰到编程练习的第一题,做了做,感觉差距还很大,把做的代码贴下来,以备往后温习。
题目:
请编写一个函数,它在一个字符串中进行搜索,查找所有在一个给定字符集合中出现的字符。这个函数的原型如下:char *find(char const *source, char const *chars);
它的基本想法是查找source字符串中匹配chars字符串中任何字符的第一个字符。函数然后返回一个指向source中第1个匹配所找到的位置的指针。如果source中的所有字符均不匹配chars中的任何字符,函数就返回一个NULL指针。如果任何一个参数为NULL,或任何一个参数所指向的字符串为空,函数也返回一个NULL指针。
举个例子,假定source指向ABCDEF。如果chars指向XYZ、JUEY或QQQQ,函数就返回一个NULL指针。如果chars指向XRCQEF,函数就返回一个指向source中C字符的指针。参数所指向的字符串是绝不会被修改的。
a.你不应该使用任何用于操纵字符串的库函数(如strcpy,strcmp,index等)。
b.函数中的任何地方都不应该使用下标引用
代码:
/**//**//**//************************************************************************
* 文件名:CharFind.c
* 文件描述:得到字符串S1中第一个且是字符串S2中的位置指针的算法
* 创建人: Luyuan, 2008年6月3日
* 版本号:1.0
* 修改记录:
*
************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#define TRUE 1
#define FALSE 0
/**//********方法声明********************************************************/
char *find_char(char const *source, char const *chars);
char *find_char2(char const *source, char const *chars);
char * my_strpbrk(const char *s1 ,const char *s2);
/**//***********************************************************************/
/**//*主函数*/
int main()
{
char *str1 = "xxammana_babi";
char *str2 = "babi";
char *p;
p = find_char2(str1, str2);
printf("The first char of found is %c\n", *p);
if( (p = my_strpbrk(str1,str2)) == NULL)
printf("No same character!\n");
else
printf("%c\n",*p);
str1 = "abc";
str2 = "def";
if( (p = my_strpbrk(str1,str2)) == NULL)
printf("No same character!\n");
else
printf("%c\n",*p);
system("pause");
return 0;
}
/**//***********************************************************************
* 函 数 名:find_char
* 参 数:
* char const *source [IN] : 进行查找的源字符串
char const *chars [IN]: 要查找的目标字符串
* 功能描述:
* 得到source中第一个且是chars中字符的位置指针。用下标
* 返 回 值:查找成功-找到的字符指针,失败NULL
* 抛出异常:
* 作 者:Luyuan 2008-06-03
************************************************************************/
char *find_char(char const *source, char const *chars)
{
int iIndex=0, j=0;
const char *pS = NULL;
int iFound = FALSE;
if(source == NULL || chars == NULL)
{
return NULL;
}
for(; source[iIndex] != NULL; ++iIndex)/**//*遍历源字符串字符*/
{
j = 0;
for(; chars[j] != NULL; ++j)/**//*遍历目标字符串字符*/
{
if(source[iIndex] == chars[j])
{
iFound = TRUE;
break;
}
}
if(iFound)/**//*若iFound值为TRUE的话表示字符已经找到*/
break;
}
pS = &source[iIndex];
return pS;
}
/**//***********************************************************************
* 函 数 名:find_char
* 参 数:
* char const *source [IN] : 进行查找的源字符串
char const *chars [IN]: 要查找的目标字符串
* 功能描述:
* 得到source中第一个且是chars中字符的位置指针。没有用下标
* 返 回 值:查找成功-找到的字符指针,失败NULL
* 抛出异常:
* 作 者:Luyuan 2008-06-03
************************************************************************/
char *find_char2(char const *source, char const *chars)
{
int iIndex=0, j=0;
const char *pS = NULL;
int iFound = FALSE;
if(source == NULL || chars == NULL)
{
return NULL;
}
for(; *(source+iIndex) != NULL; ++iIndex)/**//*遍历源字符串字符*/
{
j = 0;
for(; *(chars+j) != NULL; ++j)/**//*遍历目标字符串字符*/
{
if(*(source +iIndex) == *(chars+j))
{
iFound = TRUE;
break;
}
}
if(iFound)/**//*若iFound值为TRUE的话表示字符已经找到*/
break;
}
if(!iFound)
{
return FALSE;
}
pS = (source+iIndex);
return pS;
}
/**//***********************************************************************
* 函 数 名:my_strpbrk
* 参 数:
* char const *s1 [IN] : 进行查找的源字符串
char const *s2 [IN]: 要查找的目标字符串
* 功能描述:
* 得到s1中第一个且是s2中字符的位置指针。
* 返 回 值:查找成功-找到的字符指针,失败NULL
* 抛出异常:
* 作 者:来源C标准库函数
************************************************************************/
char * my_strpbrk(const char *s1 ,const char *s2)
{
const char *c = s2;
if (!*s1)
return (char *) NULL;
while (*s1)/**//*遍历源字符串字符*/
{
for (c = s2; *c; c++)/**//*遍历目标字符串字符*/
{
if (*s1 == *c)
break;
}
if (*c)/**//*若当前字符不为字符串结尾字符“\n”之后,为NULL,则表示已经找到,条件为真*/
break;
s1++;
}
if (*c == '\0')
s1 = NULL;
return (char *) s1;
}
/**//********************************FILE END*********************************/
注意: 1.在上面的代码中,注意有的地方声明为const char *,而有些则声明为char const *,因为无 const * 的定义,故这两种定义没有区别,都表示指向常量字符串的指针,即指针的指向的内容不可变,而指针本身可以改变。其次要注意与char * const 的区别,char * const 表示指向字符串的常量指针,即指针本身不可改变,而指针指向的内容可以改变。
2.我写的代码与库函数有多处区别。首先我单独定义了变量iFound来标识是否找到了匹配的字符,从而方便外层循环跳出。但由于做判断并跳出的代码再内层循环之后,而这时相应的指针已经指向目标字符串的末尾之后,是否找到匹配字符从指针本身即可做出判断,额外设置变量标识,纯属多余。