1.Strlen() 字符串长度
/*author: emil jonson
* function: 实现strlen(),计算字符串长度,不包括'/0'
* edition: 1.0.0
*/
#include<iostream>
#include<string>
#include<assert.h>
using namespace std;
unsigned int myStrlen(const char *str)
{
assert(str!=NULL);
unsigned int count=0; //字符长度
while(*str++!='/0')
count++;
return count;
}
int main()
{
char *str=new char[100];
cin>>str;
cout<<myStrlen(str)<<endl;
cout<<strlen(str)<<endl; //库函数中的标准strlen()
system("pause");
}
2.Strcpy() 复制字符串
/*author: emil jonson
* function: 实现strcpy(),字符串复制
* edition: 1.0.0
*/
#include<assert.h>
#include<iostream>
using namespace std;
char *strcpy( char *dest, const char *src)
{
assert((dest != NULL) && (src != NULL));
int len = 0;
const char *temp = src; //用来计算源字符串长度的指针
while(*temp++ != '/0') //计算源字符串长度
len++;
delete dest; //释放目的指针原内存,并分配空间(注:标准strcpy()
库函数未考虑这种情况,当目的空间不够时将出错!)
dest = new char[len+1];
char *re = dest; //返回用的指针,需此时才能赋值,否则若在释放dest之//前将没有释放re,仍然返回原字符串
while((*dest++ = *src++) != '/0') //未处理内存重叠情况
NULL ;
return re;
}
int main()
{
char *dest = "h";
char *src = "sello";
cout<<strcpy(dest, src)<<'/n';
system("pause");
}
附:
char * dest,
const char * source,
size_t count
)
char *start = dest;
while (count && (*dest++ = *source++)) /* copy string */
if (count) /* pad out with zeroes */
return(start);
3.Strcat() 连接字符串
/*author: emil jonson
* function: 实现strcat(),字符串连接
* edition: 1.0.0
*/
#include<stdio.h>
#include<string>
#include<assert.h>
#include<iostream>
using namespace std;
void myStrcat(char *str1, char *str2)
{
assert(( str1 != NULL )&&( str2 != NULL)); //输入验证
char *temp = new char[strlen(str1+1)]; //中间字符串用来保存str1中原字符串
int i = 0, j = 0;
while((temp[i++] = str1[j++]) != '/0')
;
delete str1; //给str1重新分配内存
str1 = new char[strlen(str1)+strlen(str2)+1];
for(int k = 0; k <= i; k++) //将原字符串存入str1
*str1++ = temp[k++];
delete temp; //释放temp,并防止野指针
temp = NULL;
while((*str1++ = *str2++) != '/0') //str1后追加str2
;
*str1++ = '/0'; //加结束符
}
int main()
{
char s1[40],s2[40];
printf("输入两个字符串:/n");
gets(s1);
gets(s2);
strcat(s1, s2);
printf("连接以后的字符串为:");
puts(s1);
system("pause");
}
4.Strcmp() 字符串比较
/*author: emil jonson
* function: 实现strcmp(),字符串比较 相等返回0,大于返回1,小于返回-1
* edition: 1.0.0
*/
#include<stdio.h>
#include<assert.h>
#include<iostream>
using namespace std;
int strcmp(const char *str1, const char *str2)
{
assert((str1 != NULL)&&(str2 != NULL)); //输入检验
while((*str1 == *str2) && (*str1 != '/0') && (*str2 != '/0')) //若字符相等,继续比较下一
{ //个字符
str1++;
str2++;
}
if(*str1 > *str2) return 1; //确定返回值
if(*str1 == *str2) return 0;
if(*str1 < *str2) return -1;
}
int main()
{
char *s1 = new char[10];
char *s2 = new char[10];
// scanf("%s", s1);
// scanf("%s", s2);
// gets(s1);
// gets(s2);
cin>>s1>>s2;
cout<<strcmp(s1, s2)<<'/n';
system("pause");
}
5.逆序字符串
/*author: emil jonson
* function: 实现字符串逆序
* edition: 1.0.0
*/
#include<string>
#include<assert.h>
#include<iostream>
using namespace std;
// 1 无返回值,直接输出逆序后字符串
void rev(const char *s)
{
assert(s != NULL);
int i = strlen(s)-1;
for(;i >= 0;i--)
cout<<s[i];
cout<<endl;
}
//2 返回新字符串 —指向对内存的指针
char *rev1(const char *s)
{
assert(s != NULL);
int len = strlen(s);
char *temp = new char[len+1]; //给新字符串分配内存
int i;
for(i = 0; len > 0; i++, len--) //给新字符串赋值
temp[i] = s[len-1];
temp[i+1] = '/0'; //新字符串加结束符'/0'
return temp;
}
//3 递归实现,无返回值
void digui_rev(const char *s)
{
assert(s != NULL);
if(*s == '/0') //退出条件,进行到字符串结束处
return;
else
{
digui_rev(s+1);
cout<<*s;
}
}
int main()
{
char *s = "hello";
rev(s); // 1 不返回
char *s1 = rev1(s);
cout<<s1<<endl; //2 返回字符串
digui_rev(s); //3 递归
cout<<endl;
int len = strlen(s);//4 不调用函数
for( ;len > 0; len--)
cout<<s[len-1];
system("pause");
}
6.回文字符串
...
7.memcpy() and memset()
...