‘\0’ 是字符串结束标志
(1)计算字符串长度
int my_strlen(const char* str)//计算字符串长度
{
assert(str != nullptr);
int i = 0;
while ('\0' != str[i])
{
++i;
}
return i;
}
代码升级:
int my_strlen_A(const char* str)//字符串长度
{
assert(str != nullptr);
const char* p = str;
while (*p != '\0')
{
p++;
}
return (int)(p - str);
}
int main()
{
char str[] = { "xsy\0uan" };
int len = my_strlen_A(str);
printf("%d \n", len);
int size = sizeof(str);
printf("%d \n", size);
return 0;
}
如何不定义任何变量来计算字符串长度:
要求:不定义计数值,不定义指针
解法:定义递归函数
(2)字符串拷贝
char* my_strcpy(char* dest, const char* src)//字符串拷贝
{
assert(dest != nullptr && src != nullptr);
int i = 0;
while ('\0' != src[i])
{
dest[i] = src[i];
i++;
}
dest[i] = '\0';
return dest;
}
代码升级:
char* my_strcpy(char* dest, const char* src)
{
assert(dest != nullptr && src != nullptr);
char* p = dest;
while ('\0' != *src)
{
*p++ = *src++;
/*
*p = *src;
p++;
src++;
*/
}
*p = '\0';
return dest;
}
代码升级:
char* my_strcpy(char* dest, const char* src)
{
assert(dest != nullptr && src != nullptr);
char* p = dest;
while (*p++ = *src++)
{
}
return dest;
}
字符串链接
void my_strcat(char* dest, const char* src)//字符串的链接
{
assert(dest != nullptr && src != nullptr);
while (*dest != '\0')
{
dest++;
}
/*while ((*dest = *src) != '\0')
{
dest++;
src++;
}*/
while (*dest++ = *src++);
}
int main(){
char ar[20] = { "xsying" };
char br[20] = { "hello" };
my_strcat_A(ar, br);
printf("%s", ar);
return 0;
}
代码升级:
char* my_strcat(char* dest, const char* src)//字符串的链接
{
assert(dest != nullptr && src != nullptr);
char* cp = dest;
while (*cp != '\0')
{
cp++;
}
/*while ((*dest = *src) != '\0')
{
dest++;
src++;
}*/
while (*cp++ = *src++);
return dest;
}
若从br的2下标进行链接,则只需要改变代码:
my_strcat(ar, &br[2]);
字符串比较
int my_strcmp(const char* fs, const char* sc)//两个字符串的比较
{
assert(fs != nullptr && sc != nullptr);
while (*fs != '\0' && *sc != '\0')
{
if (*fs == *sc)
{
fs++;
sc++;
}
else
{
break;
}
}
return *fs - *sc;
}
int my_strcmp_A(const char* fs, const char* sc)//两个字符串的比较
{
assert(fs != nullptr && sc != nullptr);
while (*fs != '\0' && *sc != '\0')
{
if (*fs != *sc)
{
break;
}
fs++;
sc++;
}
return *fs - *sc;
}
for循环:
int my_strcmp_B(const char* fs, const char* sc)//两个字符串的比较
{
assert(fs != nullptr && sc != nullptr);
for ( ;*fs != '\0' && *sc != '\0';fs++,sc++)
{
if (*fs != *sc)
{
break;
}
}
return *fs - *sc;
}
微软标准库代码:
int my_strcmp_C(const char* fs, const char* sc)//两个字符串的比较
{
assert(fs != nullptr && sc != nullptr);
int k = 0;
while ((k = *fs - *sc) == 0 && *fs++ && *sc++);
return k;
}