目录
实现strcmp(char ,char)比较字符串大小,若两字符串内容完全相同,返回0,若str1比str2长返回1,str1比str2短则返回-1,长度相同内容不同也返回-1
gets(char *)
1、
void myGets(char *str)
{
while(1){
*str = getchar();
if(*str == '\n'){
*str = '\0';
return;
}
str++;
}
}
2、
int mygets(char* p)
{
int cnt=0;
if(p==NULL)
{
printf("非法内存\n");
return 0;
}
while(*p=getchar())
{
if(*p!='\n')
{
p++;
cnt++;
}
else
{
*p = '\0';
return cnt;
}
}
}
put(char *)
1、
void myput(char *str)
{
while(*str!='\0')
{
printf("%c",*str++);
}
printf("\n");
return;
}
2、
void myPuts(char *p)//*除了变量声明以外,其他都是运算符
{ //字符串有明显的标志,都是以\0结尾
while(*p != '\0'){
putchar(*p++);
//printf("%c",*p++);
}
putchar('\n');
}
strlen(char *)
int mystrlen(char *str)
{
int len=0;
while(1)
{
if(*str=='\0')
{
return len;
}
str++;
len++;
}
}
strcat(char *,char *);合并字符串
void mystrcat(char *str1,char *str2)
{
while(*str1!='\0')
{
str1++;
}
while(*str2!='\0')
{
*str1=*str2;
str2++;
str1++;
}
return;
}
strcpy,strncpy
char* myStrcpy(char* des,const char* source)
{
if(des == NULL && source == NULL){
return NULL;
}
while(*source != '\0'){
*des++ = *source++;
}
*des = '\0';
return des;
}
char* myStrncpy(char* des,const char* source,int n)
{
if(des == NULL && source == NULL){
return NULL;
}
while(*source != '\0' && n>0){
*des++ = *source++;
n--;
}
*des = '\0';
return des;
}
memset
void myMemset(char *p,char c,int num)
{ int i;
/*if(*p++ != '\0'){
for(i=0;i<num;i++){
*p=c;
}
}*/
while(num){
*p++=c;
num--;
}
}
实现strcmp(char ,char)比较字符串大小,若两字符串内容完全相同,返回0,若str1比str2长返回1,str1比str2短则返回-1,长度相同内容不同也返回-1
int mystrcmp(char *str1,char *str2)
{
int str1len=0;
int str2len=0;
while(*str1!='\0')
{
str1++;
str1len++;
}
while(*str2!='\0')
{
str2++;
str2len++;
}
if(str1len-str2len==0){
for(int i=0;i<str1len;i++)
{
if(*str1==*str2){
str1--;
str2--;
}
else{
return -1;
}
}
return 0;
}
else if(str1len-str2len>0){
return 1;
}
else {
return -1;
}
}
strstr
#include <stdio.h>
#include <assert.h>
#include<string.h>
char* my_strstr(const char* p1, const char*p2)//参照strstr函数原型构建自己的strstr函数
{
assert(p1 != NULL);//断言该指针不为空指针
assert(p2 != NULL);
char*s1 = NULL;//创建一个空指针;
char*s2 = NULL;
char*cur = p1;
if (*p2 == '\0')
{
return (char*)p1; //如果我们所要找的子串p2为'\0',返回总串的首元素地址
}
while (*cur)//cur代表指向的是子串第一次出现的首元素地址
{
s1 = cur; //把cur指向字符串的首元素地址赋给s1
s2 = (char*)p2; //把p2指向的首元素地址赋给s2,每一次循环都要从p2的首元素地址开始重新比较
while ((*s1 != 0) && (*s2 != 0) && *s1 == *s2) //只有在s1指向的首元素地址,s2指向的首元素地址都不为'\0'的时候,才可以在总串中找子串的首地址第一次出现的时候
{ // 比较s1,s2指向的地址所对应的字符是否相等,若相等,各自指向的地址向后跳一个字节比较下一位是否相等在满足以上的条件下不断循环,若不满足,
s1++; //开始一下比较
s2++;
}
if (*s2 == '\0') //若经过上面的比较,s2指向的内容恰好是'\0',代表找到子串首次出现的地址
{ //若不满足以上情况的比较,开始以下比较
return (char*)cur;
}
if (*s1 == '\0')
{
return NULL; //若在s2指向的内容不为'\0'时,s1指向的内容率先为0,代表总串长度比子串长度短,必不存在子串,返回一个空指针
}
cur++;//代表当前cur指向的并不是子串第一次出现的首元素地址,指向的地址要往后跳一个字节
}
return NULL;//如果经过以上比较都不能得出结果,代表找不到子串,要返回空指针
}
int main()
{
const char* arr1 = "abbbcdefg";
const char* arr2 = "bbc";
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("子串不存在\n");
}
else
{
printf("找到了 子串为:%s\n", ret);
}
return 0;
}