学习目标:字符串 和 内存函数
- 字符函数和字符串函数😀
- 内存函数💜
学习内容:
- 求字符串长度
৹ strlen - 长度不受限制的字符串函数
৹ strcpy
৹ strcat
৹ strcmp - 长度受限制的字符串函数介绍
৹ strncpy
৹ strncat
৹ strncmp - 字符串查找
৹ strstr
৹ strtok
函数的具体实现与模拟实现:
1
∘ strlen—求字符串长度
size_t strlen ( const char * str );
//参数是所求字符串的地址(指针)
//返回值为无符号整型数,即字符串中字符的个数
下面展示一下strlen的使用
int main()
{
char ch[] ="abcdef"; // abcdef\0
printf("%d",strlen(ch));//屏幕打印 `6`
}
😈需要注意strlen在计算字串个数时,’ \0’ 是其结束标志,也就是说strlen统计的是字符串中第一个’\0’之前的字符个数。
2
∘ 模拟实现strlen
int my_strlen(const char* str)
{
int count = 0;
while(*str++ != '\0')//遇到\0停止循环
{
count++;
}
return count;
}
— strcpy
1
strcpy —字符串的复制
char * strcpy ( char * destination, const char * source );
//参数 destination 为指向接收复制内容的指针,source为指向将要被复制内容的指针
//返回值为目的指针
下面展示一下strlen的使用
int main()
{
char str1[] ="hello world";
char str2[20] ={0};
strcpy(str2,str1);//将str1中的内容复制到str2中去
pritnf("%s\n",str2);
//输出为 hello world
}
2
模拟实现strlen
char* my_strcpy(char * dest, const char * src )
{
char* p = dest;
while(*dest++ = *src)
{
;
}
return p;
}
—strcat
1
strcat —字符串的追加
char * strcpy ( char * destination, const char * source );
//参数 destination 为指向接收复制内容的指针,source为指向将要被复制内容的指针
//返回值为目的指针
下面展示一下strcat的使用
int main()
{
char str1[20] = "abc\0xxxxx";
char str2 []= "qer";
strcat(str1, str2);
printf("%s", str1);//屏幕打印为abcqer
return 0;
}
😈需要注意strcat,’ \0’ 是进行追加起始标志,也就是从’\0’位置进行追加,完成后在末尾再添加一个‘\0’.
2
模拟实现strcat
char* my_strcat(char* str1, char* str2)
{
char* p = str1;
while (*str1)
{
str1++;
}
while (*str1++ = *str2++)
{
;
}
return p;
}
—strcmp
1
strcat —字符串的比较
int strcmp ( const char * str1, const char * str2 );
//参数 str1 str2 是进行比较的2个字符串
//返回值为整型:1 / -1 / 0
相等0 - str1<str2返回-1 - 反之返回1
下面展示一下strcat的使用
int main()
{
char str1[] = "abc";
char str2 []= "qer";
int n = strcmp(str1, str2);
printf("%d", n);//屏幕打印 -1
return 0;
}
2
模拟实现strcmp
int my_strcmp(char* str1, char* str2)
{
while ((*str1 != '\0') && (*str1 == *str2))
{
str1++;
str2++;
}
return *str1 - *str2;//模拟实现strcmp,返回负数为str1<str2;返回负数为str1>str2;返回0为str1=str2;
}
—strncpy
1
strncpy—复制num个字符
char * strncpy ( char * destination, const char * source, size_t num );
//参数 与strncpy相比较,多了一个参数num,表示要从source复制的最大字符数
//返回值:返回destination
下面展示一下strcat的使用
int main()
{
char str1[20] = "abcdxxxxxxx";
char str2[] = "efgh";
strncpy(str1, str2, 2);
printf("%s", str1);//屏幕输出:efcdxxxxxxx
return 0;
}
2
模拟实现strncpy
char* my_strncpy(char* dest, char* src, int n)
{
char* p = dest;
assert(dest != NULL);
int sz = sizeof(src) / sizeof(char);
while (n--)
{
*dest++ = *src++;
}
return p;
}
针对strncat、strncmp同样类似于strncpy,较长度不受限制的字符串函数,多了一个可以控制的最大字符数参数num。
—strstr
1
strstr — 在字符串1中查找字符串2
const char * strstr ( const char * str1, const char * str2 );
````````````````·char * strstr ( char * str1, const char * str2 );
在str1中查找str2
返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回一个空指针。
下面展示一下strcat的使用
int main()
{
char str1[] = "abcdef";
char str2[] = "bcd";
char* p = strstr(str1, str2);
printf("%s", p);//屏幕打印 - bcdef
return 0;
}
2
模拟实现strstr
char* my_strstr(char* str1, const char* str2)
{
char* s1 = NULL;
char* s2 = NULL;
char* cp = str1;
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cp;
}
cp++;
}
return NULL;
}
—strtok
1
strtok—将字符串拆分为标记-这些标记是由分隔符中的任何字符分隔的连续字符序列
char * strtok ( char * str, const char * delimiters );
参数:str为要拆分的字符串,delmitters为分隔字符序列
如果找到分隔符,则返回指向分隔符开头的指针。 否则为空指针。 当在正在扫描的字符串中到达字符串的末尾(即空字符)时,始终返回空指针.
下面展示一下strcat的使用
int main()
{
char str1[] = "www.maw@1234-MWI";
char str2[] = ".@-"; //
char* p = strtok(str1, str2);
while (p != NULL)
{
printf("%s ", p);//屏幕输出WWW maw 1234 MWI
p = strtok(NULL, str2);----------------------------------------(*)
}
return 0;
}
😈在后续调用中,该函数需要一个空指针,并使用上一个分隔符末尾之后的位置
作为扫描的新起始位置。