#define _CRT_SECURE_NO_WARNINGS 1 
#include<stdio.h>
#include<string.h>
#include<assert.h>

//(1)strlen函数:(求长度字符串)
//size_t strlen(const char *string);
//size_t 为 unsigned int

//int main()
//{ // 3-6=-3
// //因为返回值默认为unsigned int,所以无符号数-3存补码为:11111101(253)正数
// if (strlen("abc") - strlen("abcdef")>0)
// {
// printf("hehe\n"); //打印hehe
// }
// else
// {
// printf("haha\n");
// }
// return 0;
//}

//使用递归方法:模拟实现strlen
//int my_strlen(const char* str)
//{
// assert(str != NULL);
// if (*str != '\0')
// return 1 + my_strlen(str + 1);
// else
// return 0;
//}
//int main()
//{
// char arr[] = "hello bit";
// int len = my_strlen(arr);
// printf("%d\n", len);
// return 0;
//}

//以下3个为长度不受限制的字符串函数:
//(2)strcpy函数:(复制字符串函数)
//char *strcpy(char* dest, const char *src);

//char* my_strcpy(char* dest, const char* src)
//{
// assert(dest != NULL);
// assert(src != NULL);
// char* p = dest;
// //将src的字符串拷贝到dest中,包括\0
// while (*dest++ = *src++)
// {
// ;
// }
// return p; //返回目的空间的起始地址
//}
//int main()
//{
// char arr1[30] = "as\0xxxxxxxxxxxx";
// char arr2[] = "good offer";//复制之后,末尾自动加'\0'
// //char* arr1 = "abcdef"; //错误:这是常量字符串,不能被修改
// //char arr2[]={'b','i','t'}; //错误:没有\0,会越界
// char *p=my_strcpy(arr1, arr2);
// printf("%s\n", p);
// return 0;
//}

//(3)strcat函数:(追加字符串)
//char* strcat(char* dest, const char* src);

//char* my_strcat(char* dest, const char* src)
//{
// //第一种方法:
// /*assert(dest != NULL);
// assert(src != NULL);
// char* p = dest;
// int len1 = strlen(dest);
// int len2 = strlen(src);
// int i;
// for (i = 0; i < len2; i++)
// {
// *(dest + len1+i) = *(src+i);
// }
// return p;*/
//
// //第二种方法:
// assert(dest && src);
// char* arr = dest;
// //1、找到目的字符串的'\0'
// while (*arr)
// arr++;
// //2、追加:这时候跟复制字符串差不多
// while(*arr++ = *src++)
// {
// ;
// }
// return dest;
//}
//int main()
//{
// char arr1[30] = "good \0xxxxxxxxxxxxxxxx";
// char arr2[] = "offer"; //追加完之后,后面自动加'\0'
// char *p=my_strcat(arr1, arr2);
// printf("%s\n", p);
// return 0;
//}

//(4):strcmp函数:(字符串比较函数)
//int strcmp(const char *s1,const char *s2);
//当s1<s2时,返回为负数; 当s1 = s2时,返回值 = 0; 当s1 > s2时,返回正数
//在VC编译器下:小于0是-1,大于0是1,在其它编译器下就不一样:
//所以更好的返回结果是:return (*s1 - *s2)

int my_strcmp(const char* s1, const char* s2)
{
//第一种方法:
/*assert(s1 != NULL);
assert(s2);
while (*s1 || *s2)
{
if (*s1 > *s2)
return 1;
else if (*s1 < *s2)
return -1;
s1++;
s2++;
}
return 0;*/

//第二种方法:
assert(s1 && s2);
while (*s1 == *s2)
{
if (*s1 == '\0')
{
return 0;
}
s1++;
s2++;
}
if (*s1 < *s2)
return -1;
else
return 1;
}
int main()
{
char* arr1 = "abcd";
char* arr2 = "abc";
int ret = my_strcmp(arr1, arr2);
printf("%d\n", ret);
return 0;
}