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小时内删除。
发表评论