XY

没有任何借口
posts - 9, comments - 31, trackbacks - 0, articles - 0
  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 *= s2;
   
if (!*s1)
      
return (char *) NULL;

   
while (*s1)/*遍历源字符串字符*/
   
{
      
for (c = s2; *c; c++)/*遍历目标字符串字符*/
      
{
        
if (*s1 == *c)
           
break;
      }

      
if (*c)/*若当前字符不为字符串结尾字符“\n”之后,为NULL,则表示已经找到,条件为真*/
        
break;
      s1
++;
   }


   
if (*== '\0')
      s1 
= NULL;

   
return (char *) s1;
}

/********************************FILE END*********************************/
注意:
         1.在上面的代码中,注意有的地方声明为const char *,而有些则声明为char const *,因为无 const * 的定义,故这两种定义没有区别,都表示指向常量字符串的指针,即指针的指向的内容不可变,而指针本身可以改变。其次要注意与char * const 的区别,char * const 表示指向字符串的常量指针,即指针本身不可改变,而指针指向的内容可以改变。
         2.我写的代码与库函数有多处区别。首先我单独定义了变量iFound来标识是否找到了匹配的字符,从而方便外层循环跳出。但由于做判断并跳出的代码再内层循环之后,而这时相应的指针已经指向目标字符串的末尾之后,是否找到匹配字符从指针本身即可做出判断,额外设置变量标识,纯属多余。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理