C语言没有字符串类型
一、函数介绍
长度不受限制的字符串函数:strcpy strcat strcmp
1.strlen
1)字符串末端隐藏了一个\0,strlen数\0之前有几个字符
char arr1[ ]="abcdef";
char arr2[ ]={'a','b','c','d','e','f'};
char arr3[ ]={'a','b','c','d','e','f',‘\0’};
char arr4[10]={'a','b','c','d','e','f'};
int len1=strlen(arr1);
int len2=strlen(arr2);
int len3=strlen(arr3);
int len4=strlen(arr4);
printf("%d\n",len1);//6
printf("%d\n",len2);//没有\0,随机值
printf("%d\n",len3);//6
printf("%d\n",len4);//6,不完全初始化默认填上0,'\0'的ASCII是0,等于有\0
2)注意函数的返回值为size_t,是无符号的
int main()
{
const char*str1 = "abcdef";
const char*str2 = "bbb";
if(strlen(str2)-strlen(str1)>0)
{
printf("str2>str1\n");//strlen返回无符号整型,两个无符号整型相减是特别大的整数
}
else
{
printf("srt1>str2\n");
}
}
3)模拟strlen
int my_strlen(const char*str)
{
assert(str!=NULL);
int count=0;
while(*str!='\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[]="abcdef";
int len=my_strlen(arr);
printf("%d\n",len);
}
2.strcpy
字符串拷贝
int main()
{
char arr1[20]={0};
char arr2[]="abcdef";
strcpy(arr1,arr2);
printf("%s\n",arr1);//abcdef
}
1)源字符串必须以 '\0' 结束
int main()
{
char arr1[20]={0};
char arr2[]={'a','b','c'};
strcpy(arr1,arr2);
printf("%s\n",arr1);//不打印因为源字符串没有\0
}
2)strcpy会将源字符串中的 '\0' 拷贝到目标空间
3)目标空间必须足够大,以确保能存放源字符串
int main()
{
char arr1[4]={x};
char arr2[]="abcdef";
strcpy(arr1,arr2);
printf("%s\n",arr1);//程序崩了,因为arr1放不下
}
4)目标空间必须可变。
int main()
{
char*arr1="sdfGHJK";//指向常量字符串,常量是不可修改的
char arr2[]="abcdef";
strcpy(arr1,arr2);
printf("%s\n",arr1);//程序崩了
}
5)模拟strcpy
strcpy返回的是目标空间的起始地址
strcpy函数的返回类型的设置是为了实现链式反应
char*my_strcpy(char*dest,const char*src)
{
//assert(dest!=NULL);
//assert(src!=NULL);
assert(src&&dest);
char*ret=dest;//strcpy返回的是目标空间的起始地址
while(*dest++=*src++)
{
;
}
return ret;
}
int main()
{
char arr1[20]={0};
char arr2[]="hello hello";
my_strcpy(arr1,arr2);
printf("%s\n",arr1);
}
3.strcat
1)源字符串必须以 '\0' 结束
2)目标空间必须有足够的大,能容纳下源字符串的内容
3)目标空间必须可修改
4)模拟strcat
a.找源字符串中的\0
b.把源字符串拷贝到目标空间
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[]=" hehe";
my_strcat(arr1,arr2);
printf("%s\n",arr1);
}
4.strcmp
strcmp函数比较的不是字符串的长度而是比较字符串中对应位置上的字符的大小,如果相同,就比较下一对,直到不同或者都遇到\0
int main()
{
char arr1[]="abcdef";
char arr2[]="abq";
int ret=strcmp(arr1,arr2);
printf("%d\n",ret);//vs下1
}
1)标准规定:
2)模拟strcmp
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;
}
int main()
{
char arr1[]="abcdef";
char arr2[]="abq";
int ret=strcmp(arr1,arr2);
printf("%d\n",ret);//1
}
长度受限制的字符串函数: strncpy strncat strncmp
5.strncpy
1)功能
拷贝num个字符从源字符串到目标空间。
int main()
{
char arr1[]="abcdef";
char arr2[]="abqfghjkl";
strncpy(arr1,arr2,3);//只拷贝3个
printf("%s\n",arr1);//abq
}
2)模拟strncpy
char * My_Strncpy(void* dest, const void *src, int num)
{
assert(dest);
assert(src);
char *ret = dest;//定义返回值指针
//覆盖字符串dest的字符
while (num)
{
*(char *)dest = *(char *)src;
((char *)dest)++;
((char *)src)++;
num--;
}
//给末尾加字符串判断'\0'
*(char *)dest = '\0';
return ret;
}
6. strncat
1)功能
追加num个字符和\0从源字符串到目标空间。
如果源字符串的长度小于num不会在目标的后边追加0,直到num个。
int main()
{
char arr1[]="abcdef";
char arr2[]="abqfghjkl";
strncpy(arr1,arr2,5);//追加5个和\0
printf("%s\n",arr1);//abcdefabqfg
}
2)模拟strncat
char* My_Strncat(void* dest, const void* src, int num)
{
assert(dest);
assert(src);
char* ret = dest;//定义返回地址
while (*(char*)dest != '\0')//找到目的地字符串的最后一个字符
{
((char*)dest)++;
}
//在字符串后加字符
while (num)
{
*(char*)dest = *(char*)src;
((char*)dest)++;
((char*)src)++;
num--;
}
//给字符串最后一位加上'\0'
*(char*)dest = '\0';
return ret;
}
7.strncmp
int main()
{
char arr1[]="abcdef";
char arr2[]="abqfghjkl";
int ret=strncmp(arr1,arr2,4);//比较4个,如果4个之前就比出来了就不比了
printf("%d\n",ret);//-1
}
if(arr1<arr2)//比较数组首元素地址
{
}
if("abc"<"abcdef")//比较字符串首元素地址
{
}
8.strstr
1)str返回值
看str2是不是str1的子串,返回str2在str1中第一次出现的地址,如果没有出现返回空指针
int main()
{
char arr1[]="abcdefabcdef";
char arr2[]="cdef";
char*ret=strstr(arr1,arr2);
if(ret==NULL)printf("找不到子串\n");
else printf("%s\n",ret);//cdefabcdef
}
2) 模拟strstr
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[]="abcdefabcdef";
char arr2[]="cdef";
char*ret=my_strstr(arr1,arr2);
if(ret==NULL)printf("找不到子串\n");
else printf("%s\n",ret);//cdefabcdef
}