strlen
size_t strlen ( const char * str);
//返回值是size_t 是无符号的。
字符串已经‘\0’作为结束标志,strlen返回的是在字符串中‘\0’前面出现的字符,不包括'\0'。
int main()
{
char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f' };
int len = strlen(arr);//string length
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
//这样命名数组的话,strlen无法算出字符数组大小。因为每个字母后面不知道隔了多少个空间才到\0。
// char arr[] = { 'a', 'b', 'c', 'd', 'e', 'f','\0'};
char arr[10] = { 'a', 'b', 'c', 'd', 'e', 'f' };
这两种可以解决。一个放置\0,一个让数组默认初始化成0。
int main()
{
if (strlen("abc") - strlen("qwerty") > 0)
{
printf(">\n");
}
else
{
printf("<=\n");
}
//输出结果是大于,因为strlen返回的是无符号数字,两个无符号数字相减还是无符号数字。翻译过来是十分大的正数。如果强制转换为int就可以得出想要的结果。
return 0;
}
模拟实现
#include <assert.h>
//计数器的方法
size_t my_strlen(const char* str)
{
int count = 0;
assert(str != NULL);
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abcdef";
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
strcpy
char * strcpy(char * destination , const char * source);
//destination是目标,source是源
注意点:
源字符串必须已'\0'结束。
会把源字符串的‘\0’拷贝到目标空间。
目标空间要足够大,确保可以存放源字符串。
目标空间要是可变的。
int main()
{
char* arr1 = "qwertyuiop";//arr1指向的是常量字符串,常量是不可修改的
char arr2[] = "abcdef";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
模拟实现
char* my_strcpy(char*dest, const char* src)
{
//assert(dest != NULL);
//assert(src != NULL);
assert(src && dest);
char* ret = dest;
//返回目标空间起始地址。
while(*dest++ = *src++)
{
;
}
return ret;
//或者
//while(*src !='\0')
//{
// *dest = *src;
// dest++;
// src++;
//}
//*dest = *src;
}
int main()
{
char arr1[20] = { 0 };
char* arr2 = "hello bit";
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
stract
用于字符串追加,
char * stract ( char * destination , const char * source) ;
注意:
源字符串也必须以‘\0’结束。
目标空间要足够大且可改变。
int main()
{
char arr1[20] = "hello";
char arr2[] = " bit";
//char arr1[20] = "hello\0XXXXXXX";
//char arr2[] = " bit";
//追加结果为hello bit\0XXX。
//当目标字符串中间段有\0时,替换\0为第一个字符后继续追加源字符串。
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
模拟实现
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
char* my_strcat(char* dest, char* src)
{
assert(dest && src);
char* ret = dest;
//找目标空间中的\0
while (*dest)
{
dest++;
}
//拷贝
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "hello";
char arr2[] = " bit";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strcmp
用于比较
char * strcmp ( char * destination , const char * source) ;
//当str1小于str2时返回小于0的数字,数字大小和编译器设置有关。
//当str1大于str2时返回大于0的数字,
//当str1等于str2时返回0。
int main()
{
char arr1[] = "abcdef";
char arr2[] = "qwe";
strncpy(arr1, arr2, 5);
int c = strncpy;
printf("%d\n", strncpy);
return 0;
}
//strcmp函数比较的不是字符串的长度!!!!
//而是比较字符串中对应位置上的字符的大小(ASCII码值),如果相同,就比较下一对儿,直到不同或者都遇到\0。
模拟实现
int my_strcmp(const char* s1, const char* s2)
{
assert(s1 && s2);
while (*s1 == *s2)
{
if (*s1 == '\0')
{
return 0;//相等的情况。
}
s1++;
s2++;
}
//不相等
if (*s1 > *s2)
return 1;
else
return -1;
//return *s1 - *s2;这么写也可以。
}
int main()
{
char arr1[] = "abcd";
char arr2[] = "abdc";
int ret = my_strcmp(arr1, arr2);
if (ret >0)
{
printf(">\n");
}
else if (ret == 0)
{
printf("== \n");
}
else
{
printf("<\n");
}
printf("%d\n", ret);
return 0;
}
strcpy,strcat,strcmp是长度不受限制的字符串函数。使用的时候会有风险,比如目标空间不足。
于是就有长度受限制的函数,strncpy,strncat,strncmp。
strncpy
char * strncpy(char * strDest,const char * strSource,size_t count);
//count是拷贝源字符串字符的个数。count数字大于源字符串长度时会拷贝\0过去。
strncat
char * stncat(char * strDest,const char * strSource,size_t count);
int main()
{
char arr1[20] = "abcdef\0XXXXXXXX";
char arr2[] = "qwe";
strncat(arr1, arr1, 5);
//会把\0也追加过去。当追加的个数大小大于源字符串大小时不会追加额外的\0,只追加一个。
printf("%s\n", arr1);
return 0;
}
strncmp
char * stncmp(char * strDest,const char * strSource,size_t count);
//cmp是比较第几个元素。
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abcdq";
int ret = strncmp(arr1, arr2, 4);
printf("%d\n", ret);
return 0;
}
注意:
int main()
{
char arr1[] = "abcdef";
char arr2[] = "abc";
if (arr1 < arr2)
//在比较地址。
{
}
char* p = "abc";
if ("abc" < "abcdef")
{
}
return 0;
}
strstr
char * strstr ( const char * str1,const char * str2);
判断str2是否在str1内出现,有的话就返回str2在str1第一次出现的位置,否则返回空指针。
模拟实现:
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = str1;
const char* s2 = str2;
const char* cur = str1;
while (*cur)
{
s1 = cur;
s2 = str2;
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cur;
}
cur++;
}
return NULL;//找不到
}
//查找子串的时候
int main()
{
char arr1[] = "abbbcdef";
char arr2[] = "bbc";
char* ret = my_strstr(arr1, arr2);
if (NULL == ret)
{
printf("找不到子串\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}