1. 库函数的实现
strcpy的函数原型:
char *strcpy(char *strDest, const char *strSrc)
其中strDest 是目的字符串,strSrc 是源字符串。
char *strcpy(char *strDest, const char *strSrc)
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;
if ( strDest == strSrc)
return strDest ;
char *tempptr = strDest ;
while( (*strDest++ = *strSrc++) != ‘/0’)
return tempptr ;
}
strlen的函数原型:
int strlen( const char *str )
{
 assert( strt != NULL ); //断言字符串地址非0
 int len;
 while( (*str++) != '\0' )
 {  len++; }
 return len;
}
12. 已知String类定义如下:
class String
{
public:
String(const char *str = NULL);    // 通用构造函数
String(const String &another);    // 拷贝构造函数
~ String();    // 析构函数
String & operater =(const String &rhs);    // 赋值函数
private:
char *m_data;    // 用于保存字符串
};
尝试写出类的成员函数实现。
//String(const char* str)
String::String(const char *str)
{
if ( str == NULL )    //strlen在参数为NULL时会抛异常才会有这步判断
{
m_data = new char[1] ;
m_data[0] = '\0' ;
}
else
{
m_data = new char[strlen(str) + 1];
strcpy(m_data, str);
}
};
//String(const String& str)
String::String(const String &another)
{
m_data = new char[strlen(another.m_data) + 1];
strcpy(m_data, other.m_data);
}
//String& operator=(const String& str)
String& String::operator =(const String &rhs)
{
if ( this == &rhs)
return *this ;
delete []m_data;        //删除原来的数据,新开一块内存
m_data = new char[strlen(rhs.m_data) + 1];
strcpy(m_data,rhs.m_data);
return *this ;
}
//~String()
String::~String()
{
delete []m_data ;
}
2. 字符串移动和修改
1编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是" abcdefghi “,如果n=2,移位后应该是 “hiabcdefg ”。
(1)使用标准库函数方法:
void LoopMove(char *pStr, int steps)
{
    int n = strlen(pStr) - steps;
    char temp[MAX_LEN];
    strcpy(temp, pStr + n);
    strcpy(temp + steps, pStr);
    *(temp + strlen(pStr)) = ‘\0’;
    strcpy(pStr, temp);
}
(2)不使用标准库函数的方法:
请看第3题和评论
2、将一句话里的单词进行倒置,标点符号不倒置。比如一句话:i come from beijing.倒置后变成:beijing. from come i
  解析:解决该问题可以分为两步:第一步全盘置换该语句成:.gnijieb morf emoc i。第二步进行部分翻转,如果不是空格,则开始翻转单词。
#include <iostream>
using namespace std;
int main ()
{
    int num = -12345, i=0, j=0, flag=0, begin, end;
    char str[] = "i come from beijing.";
    char temp;
    j = strlen(str) - 1;
    //第一步是进行全盘翻转
    while(j>i)
    {
        temp = str[i];
        str[i++] = str[j];
        str[j--]=temp;
    }
    //字符串函数编程题第二步进行部分翻转
    i=0;
    while(str[i])
    {
        if(str[i] != ' ')
        {
            begin = i;
            while(str[i] && str[i] != ' ')
                i++;    //str[i]为空格符
            i = i - 1;        //空格符回退一个
            end = i;
        }
        while(end > begin) //部分翻转
        {
            temp = str[begin];
            str[begin++] = str[end];
            str[end--] = temp;
        }
        i++;
    }
    cout << "string:" << str << endl;
}
3、编程:输入一行字符串,出其中出现的相同且长度最长的字符串,输出它及其首字符的位置。例如:“yyabcdabjcabceg”,输出结果应该为 abc和 3。
#include <iostream>
#include <string>
using namespace std;
int main ()
{
    String str, tep;
    cout << "请输入字符串:";
    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;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。