c语言本身是没有字符串类型的,字符串常常放在常量字符串或者字符数组中,字符串常量适用于对他不做修改的字符串函数。
求字符串长度:
strlen:
size_t strlen( const char* str);
- 字符串以‘\0’作为结束标志,strlen函数返回的是‘\0’之前的字符个数,不包含‘\0’.
- 参数指向的字符串必须是以’\0’结束的。
- 返回值size_t是一个无符号的整形。(易错点)
- 求长度不改变字符串应该用const修饰。
实现strlen的三种方式:
//计数器方式
int my_strlen(const char*str)
{
int count = 0;
while(*str)
{
count++;
str++;
}
return count;
}
//不创建临时变量的方式(递归)
int my_strlen(const char* str)
{
if(*str == '\0')
{
return 0;
}
return 1+my_strlen(str+1);
}
//指针相减的方式
int my_strlen(const char* str)
{
char* p = *str;
while(*p)
{
p++;
}
return p-str;
}
strcpy:
- 源字符串必须以’\0’结束。
- 会将’\0’拷贝到目标空间。
- 目标空间需要足够大。
- 目标空间必须可变。
//参数顺序
//函数的功能终止条件
//assert
//const修饰指针
//函数返回值
char* my_strcpy(char* dest, const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while(*dest++ = *src++)
{
;
}
return ret;
}
strcat:
char* strcat(char* destination, const char* source);
- 源字符串不许要以’\0’结束。
- 目标空间需要足够大。
- 目标空间必须可修改。
char* my_strcat(char* best, const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
while(*dest)
dest++;
while(*dest++ = *src++ );
return ret;
}
strstr:
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
char* my_strstr(const char* str1, const char *str2)
{
assert(str1);
assert(str2);
char* cp = (char*)str1; //const 类型的变量不能给普通类型赋值
char* substr = (char*)str2;
char *s1 = NULL;
if(*str2 == '\0')
{
return NULL;
}
while(*cp)
{
s1 = cp;
substr = str2;
while(*s1 && (*s1 == *substr))
{
s1++;
substr++;
}
if(*substr == '\0')
{
return cp;
}
cp++;
}
}
strcmp: 比较
标准规定:
- 第一个字符串大于第二个字符串,则返回大于0的数字。
- 第一个字符串等于第二个字符串,则返回0。
- 第一个字符串小于第二个字符串,则返回小于0的数字。
int my_strcmp(const char* str1, const char* str2)
{
int ret = 0;
assert(str1);
assert(str2);
while( !(ret = *(unsigned char*)str1- *(unsigned char*)str2) && *str1)
++str1,++str2;
return ret;
}
其他函数
strtok | 切分字符串 |
---|---|
strerror | 错误报告 |
tolower\toupper | 字符转换 |
memcpy | 按字节拷贝 |
memmove | 原内存块和目标内存块可以重叠的字节拷贝 |
memcmp | 按字节比较 |