#define _CRT_SECURE_NO_WARNINGS
#include<string>
#include<iostream>
#include<cassert>
using namespace std;
size_t mystrlen(const char *source);//字符串长度
char *mystrcat(char *destin, const char *source); // 字符串拼接函数
char *mystrcpy(char *destin, const char *source);//拷贝一个字符串到另一个
int mystrcmp(const char *str1, const char *str2); //串比较
char *mystrchr(const char *str, const char c);//在一个串中查找给定字符的第一个匹配之处
int my_strcmpi(const char *str1, const char *str2);// 将一个串与另一个比较, 不管大小写
char *mystrstr(char *const dest, const char * const source);//在串中查找指定字符串的第一次出现
size_t mystrlen(const char *source)//字符串长度
{
assert(source != nullptr);
size_t count = 0;
while (*source++!='\0')
{
count++;
}
return count;
}
char *mystrcat(char *destin,const char *source) // 字符串拼接函数
{
assert(destin != nullptr);
assert(source != nullptr);
char *temp = destin;
while (*destin!= '\0') //这里不知道为什么不能合并,那就老老实实写,以后再研究
{
destin++;
}
while ((*destin++ = *source++) != '\0');
return temp;
}
char *mystrcpy(char *destin,const char *source)//拷贝一个字符串到另一个
{
assert(destin != nullptr);
assert(source != nullptr);
char *temp = destin;
while ((*destin++ = *source++) != '\0');
return temp;
}
int mystrcmp(const char *str1,const char *str2)//串比较
{
assert(str1 != nullptr);
assert(str2 != nullptr);
int temp = 0;
while ((temp = (*str1-*str2)) == 0 && *str1) //这里注意也是不能一味合并大括号里面的自增进去的
//因为后面还要判断str1值,不能提前自增。
{
str1++;
str2++;
}
if (temp>0)
{
return 1;
}
else if (temp<0)
{
return -1;
}
return temp;
}
char *mystrchr(const char *str,const char c)//在一个串中查找给定字符的第一个匹配之处
{
assert(str != nullptr);
while (*str!= c) //这里不加判断*str是因为vs2017上就不判断呀,我的实现要求就是运行结果和原函数一样
//连报错都一样!!我目的实现了,装了逼就跑啊
{
str++; //注意这里递增也老老实实写大括号里,不要装逼写条件里,为什么,运行结果不一样啊
//结果论就行了,我怎么知道为什么,电脑又不是我发明的
}
return (char *)str;
}
int my_strcmpi(const char *str1, const char *str2)// 将一个串与另一个比较, 不管大小写
{
assert(str1 != nullptr);
assert(str2 != nullptr);
char *temp1 = (char *)str1;
char *temp2 = (char *)str2;
int temp = 0;
while (temp == 0 && *temp1)
{
if (isalpha(*temp1) && isupper(*temp1) && *temp1)
{
*temp1 += 32;
}
if (isalpha(*temp2) && isupper(*temp2) && *temp2)
{
*temp2 += 32;
}
temp = *temp1 - *temp2;
temp1++;
temp2++;
}
if (temp==0&&mystrlen(str1)<mystrlen(str2)) //能看懂吧,加这么段代码很重要
{
if (isalpha(*temp2) && isupper(*temp2))
{
*temp2 += 32;
}
temp = -*temp2;
}
return temp;
}
char *mystrstr(char *const dest, const char * const source)//在串中查找指定字符串的第一次出现
{
assert(dest != nullptr);
assert(source != nullptr);
int dlength = mystrlen(dest) - mystrlen(source);
if (dlength<0)
{
return nullptr;
}
for (size_t i = 0; i < dlength; i++)
{
int flag = 1;//默认存在
for (size_t j = 0; j < mystrlen(source); j++)
{
if (dest[i + j] != source[j])
{
flag = 0; //不匹配
break;
}
}
if (flag)
{
return dest + i;
}
if (i == dlength - 1 && flag == 0)
{
return nullptr;
}
}
}
C++str函数中几个常用函数原型(vs2017下编译运行效果与源函数完全一样)
最新推荐文章于 2024-08-09 10:58:39 发布