关于字符串的一些算法

 

ExpandedBlockStart.gif 代码
//  programmer_string_test.cpp : 定义控制台应用程序的入口点。
//

#include 
" stdafx.h "
#include 
" stdio.h "
#include 
< iostream >
#include 
" assert.h "
#include 
< string >
using   namespace  std;
#define  MAX 50

/* 不用itoa函数,将整数转化成字符串数 */
void  itoa_test()
{
    
int  num,i,j = 0 ;
    
char  a[MAX],b[MAX];
    cout 
<<   " please input a interger: "   <<  endl;
    cin 
>>  num;
    
while (num)
    {
        i
= num % 10 ;
        a[j]
= i + ' 0 ' ;
        j
++ ;
        num
/= 10 ;
    };
    a[j]
= ' \0 ' ;
    cout 
<<   " the inverted string is :  "   <<  a  <<  endl;
    
    
// 求出来的a是倒转的,现将其再转回去
     for (j = 0 ;j < strlen(a);j ++ )
    {
        b[j]
= a[strlen(a) - j - 1 ];
    }
    b[j]
= ' \0 ' ;

    cout 
<<   "  the converted string is : "   <<  endl
        
<<  b  <<  endl;
}

/*  不用atoi函数,将字符串转换成整数 */
void  atoi_test()
{
    cout 
<<   "  atoi_test:  "   <<  endl;
    
char  a[MAX];
    
int  i,num = 0 ,len;
    cout 
<<   " please input a num string:  "   <<  endl;
    cin.getline(a,MAX);
    len
= strlen(a);
    
for (i = 0 ;i < len;i ++ )
    {
        num
= num * 10 + a[i] - ' 0 ' ;
    }

    cout 
<<   "  the convered number is  "   <<  num  <<  endl;
}

/*  strcpy test  */
char   *  strcpy_fun( char   * dest,  char   * src)
{
    
int  i,len;
    len
= strlen(src);
    cout 
<< "  the len of src is  "   <<  len  <<  endl;
    
for (i = 0 ;i < len;i ++ )
        
* dest ++=* src ++ ;
    cout 
<<   "  i is  "   <<  i  << endl;
    dest[i]
= ' \0 ' ;
    
char  c;
    
for (i = 0 ;i < 5 ;i ++ )
    {
        c
= dest[i];
        cout 
<<  c  <<  endl;
    }
    
return  dest;
}

char   * strcpy_answer( char   * dest,  const   char   * src)
{
    assert((dest
!= NULL)  &&  (src  != NULL));
    
char   * address = dest;
    
while (( * dest ++=* src ++ ) != ' \0 ' );
    
return  address;
}

void  strcpy_test()
{
    cout 
<<   " strcpy_test:  "   <<  endl;
    
char  dest[ 5 ],dest1[ 5 ],src[ 5 ] = " hi " ;
    strcpy_fun(dest,src);
    strcpy_answer(dest1,src);
    
    cout 
<< "  the dest string is  "   <<  dest  <<  endl;
    cout 
<< "  the programmer answer is :  " <<  dest1  << endl;
}


char   * string_shift_fun( char   * str,  int  steps)
{
    
char  tmp[MAX];
    
int  len,i;
    len
= strlen(str);
    
for (i = 0 ;i < steps;i ++ )
        tmp[i]
= str[len - steps + i];
    
for (i = 0 ;i < (len - steps);i ++ )
        tmp[steps
+ i] = str[i];
    tmp[len]
= ' \0 ' ;
    strcpy(str,tmp);
    cout 
<<   " the tmp is : "   << tmp  <<  endl;
    
return  str;
}

void  string_shift_answer( char   * pStr, int  steps)
{
    
int  n = strlen(pStr) - steps;
    
char  tmp[MAX];
    memcpy(tmp,pStr
+ n,steps);
    memcpy(tmp
+ steps,pStr,n);
    memcpy(pStr,tmp,strlen(pStr));
}

void  string_shift_test()
{
    
/*
    cout << "string_shift_test:" << endl;
    char str[MAX],*str1;
    cin.getline(str,10);
    
*/
    
char  str[] = " hello " , * str1;
    str1
= string_shift_fun(str, 2 );
    
    cout 
<<   " the shifted string is: " <<  str1  <<  endl;

    string_shift_answer(str,
2 );
    cout 
<<   " shifted angain:the shifted string of programer answer is : "   <<  str  <<  endl;
}


// 找出字符串中出现的相同且长度最长的字符串,输出它的及其首字符的位置
int  longest_same_string_answer()
{
    
string  str,tep;
    cout 
<<   " please input string : "   <<  endl;
    cin 
>>  str;

    
for ( int  i = str.length() - 1 ;i > 1 ;i -- )
        
for ( int  j = 0 ;j < str.length();j ++ )
            
if (j + i <= str.length())
            {
                size_t t
= 0 ;
                size_t num
= 0 ;
                tep
= str.substr(j,i);
                t
= str.find(tep);
                num
= str.rfind(tep);
                
if (t != num)
                {
                    cout 
<<  tep  <<   "   "   <<  t + 1   << endl;
                    
return   0 ;
                }
            }
    
return   0 ;
}

// 返回主串中字符字串以后的所有字符
int  substr_afterstr_fun( char   * str, char   * substr)
{
    
int  len,sublen,i = 0 ,j = 0 ;
    len
= strlen(str);
    sublen
= strlen(substr);

    
while (i < len && j < sublen)
    {
            
if (str[i] == substr[j])
            {
                i
++ ;
                j
++ ;
            }
            
else
            {
                i
= i - j + 1 ;
                j
= 0 ;
            }
    }
    
if (j >= sublen)
        
return  (i - sublen);
}
    
void  substr_afterstr()
{
    
char  str[] = " hellostrhaha " ,substr[] = " str " ;
    
int  pos;
    pos
= substr_afterstr_fun(str,substr);
    cout 
<<   " the string begin with the sub string is : "   <<  str + pos  <<  endl;

}


// 将一句话里的单词倒转,标点符号不倒转
void  invert_fun( char   * str)
{
    
int  len ,i;
    
char  tmp[MAX];
    len
= strlen(str);
    
for (i = 0 ;i < len;i ++ )
        tmp[i]
= str[len - 1 - i];
    tmp[len]
= ' \0 ' ;
    strcpy(str,tmp);
}

void  invert_word()
{
    
char  str[] = " I come from tianjin. " ,tmp[MAX],word[MAX];
    
int  len,i = 0 ,j = 0 ,k,m;
    len
= strlen(str);
    invert_fun(str);

    cout 
<<   " the totally invert string is: " <<  str  <<  endl;


    
while (i < len)
    {
        word[j
++ ] = str[i ++ ];
        
if (str[i] == '   ' )
        {
            word[j]
= ' \0 ' ;
            invert_fun(word);
            
for (k = 0 ;k < strlen(word);k ++ )
                str[i
- j + k] = word[k];
            j
= 0 ;
            i
++ ;
        }
    }

    cout 
<<   " the invert string is : "   <<  str  <<  endl;
}


int  _tmain( int  argc, _TCHAR *  argv[])
{
    
// write a user defined function about itoa
    
// itoa_test();
    
    
//
    
// atoi_test();

    
//
    
// strcpy_test();
    
    
//
    
// string_shift_test();

    
//
    
// longest_same_string_answer();
    
    
//
    
// substr_afterstr();

    
//
    invert_word();
    
while ( 1 );
    
return   0 ;
}

 

 

转载于:https://www.cnblogs.com/newgreen/archive/2010/10/17/1853687.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值