一、求字符串长度
1.strlen
计算字符串的长度。
size_t strlen ( const char* str ) ;
#include <string.h>
int main()
{
int len1 = strlen("abcdef"); //6
char arr[] = {'a','b','c','d','e','f'};
int len2 = strlen(arr); //随机值
return 0;
}
注意点:
1)字符串'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前出现的字符个数(不包含'\0')。
2)当字符串不以'\0'结尾时,将输出一个随机值(系统越界访问直到找到'\0'字符为止)。
3)size_of 是无符号整型。
所以两个strlen的结果直接相减得到的也是无符号整型,所以即使是负数也被认为是正数。
int main()
{
if(strlen("abc")-strlen("abcdef")>0)
printf("AAA\n");//执行这个语句AAA
else
printf("BBB\n");
return 0;
}
二、长度不受限制的字符串函数
1.strcpy
将一个字符串(source)拷贝到另一个字符串(destination)中。
char* strcpy ( char* destination , const char* source)
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "hello";
strcpy(arr1,arr2);
//arr1 == "hello\0ghi"
return 0;
}
注意点:
1)源字符串必须以'\0'结束,strcpy执行到'\0'字符停止。
2)源字符串中的'\0'也会被拷贝到目标空间。
3)目标空间应该足够大以存放源字符串。
4)目标空间必须可变。
char* arr[] = "hello"; //字符数组,可变
char* p = "hello"; //字符串常量,不可变
5)模拟实现。
char* my_strcpy(char* dest,const char* src)
{
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
//拷贝src指向的字符串内容拷贝到dest的空间,包含'\0'
while(*dest++ = *src++)
{
;
}
//返回目的空间的起始地址
return ret;
}
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "hello";
my_strcpy(arr1,arr2);
//arr1 == "hello\0ghi"
return 0;
}
2.strcat
将一个字符串(source)追加到另一个字符串(destination)后。
char* strcat ( char* destination , const char* source ) ;
int main()
{
char arr1[30] = "hello\0xxxxxxxxx";
char arr2[] = "world";
strcat(arr1,arr2);
printf("%s\n",arr1);
//arr1[] == "helloworld\0xxxx"
return 0;
}
注意点:
1)源字符串必须以'\0'结束,strcat从目标字符串的'\0'开始,执行到源字符串的'\0'字符停止。
2)源字符串中的'\0'也会被追加到目标空间。
3)目标空间应该足够大以容纳追加的源字符串。
4)目标空间必须可变。
5)不可以给自己追加。
给自己追加会使得src和dest两个字符串同时改变,找不到'\0'而死循环。
6)模拟实现。
char* my_strcat(char* dest,const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src);
//1.找到目的字符串的'\0'
while(*dest != '\0')
{
dest++;
}
//2.追加
while(*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[30] = "hello\0xxxxxxxxx";
char arr2[] = "world";
my_strcat(arr1,arr2);
printf("%s\n",arr1);
//arr1[] == "helloworld\0xxxx"
return 0;
}
3.strcmp
比较两个字符串是否相等(首字母)。
若str1>str2,返回大于0的数;若str1<str2,返回小于0的数;若str1=str2,返回0 。
int strcmp ( const char* str1,const char* str2 ) ;
int main()
{
char* p1 = "abcdef";
char* p2 = "sqwer";
strcmp(p1,p2); //-1
return 0;
}
注意点:
1)注意使用时strcmp返回值为大于或小于或等于0的数字,而非1,-1,0 。
2)模拟实现。
int my_strcmp(consy char* str1,const char* str2)
{
assert(str1 && str2);
//比较
while(*str1 == *str2)
{
if(*str1 == '\0')
{
return 0;//相等
}
str1++;
str2++;
}
if(*str1 > *str2)
return 1; //大于
else
return -1; //小于
int main()
{
char* p1 = "abcdef";
char* p2 = "sqwer";
my_strcmp(p1,p2); //-1
return 0;
}
三、长度受限制的字符串函数
与长度不受限制的字符串函数区别主要在于多了一个参数(num)以控制操作的字符个数。
1.strncpy
将一个字符串(source)拷贝到另一个字符串(destination)中,共拷贝num个。
char* strncpy ( char* destination , const char* source , size_t num ) ;
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "hello";
strncpy(arr1,arr2,3);
//arr1 == "heldefghi"
return 0;
}
注意点:
1)如果源字符串的长度小于num,则拷贝完源字符串后,在后面追加'\0'直到num个。
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "hi";
strncpy(arr1,arr2,6);
//arr1 == "hi\0\0\0\0ghi"
return 0;
}
2)模拟实现。
char* my_strncpy(char* dest,const char* src,int count)
{
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
//拷贝src指向的字符串内容到dest的空间,直到count为0或拷贝至'\0'
while(count && (*dest++ = *src++))
{
count--;
}
//后续全变成'\0'
if(count)
{
while(--count)
{
*dest++ = '\0';
}
}
//返回目的空间的起始地址
return ret;
}
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "hello";
my_strncpy(arr1,arr2,3);
//arr1 == "heldefghi"
return 0;
}
2.strncat
将一个字符串(source)追加到另一个字符串(destination)后,追加num个字符。
char* strncat ( char* destination , const char* source ,size_t num ) ;
int main()
{
char arr1[30] = "hello\0xxxxxxxxx";
char arr2[] = "world";
strncat(arr1,arr2,3);
printf("%s\n",arr1);
//arr1[] == "hellowor\0\0\0xxxx"
return 0;
}
注意点:
1)追加结束后会自动补一个'\0'
2)模拟实现。
char* my_strncat(char* dest,const char* src,int count)
{
char* ret = dest;
assert(dest != NULL);
assert(src);
//1.找到目的字符串的'\0'
while(*dest != '\0')
{
dest++;
}
//2.追加
while(count--)
{
if(!(*dest++ = *src++));
return ret;
}
*dest = '\0';
return ret;
}
int main()
{
char arr1[30] = "hello\0xxxxxxxxx";
char arr2[] = "world";
my_strncat(arr1,arr2);
printf("%s\n",arr1);
//arr1[] == "helloworld\0xxxx"
return 0;
}
3.strncmp
比较两个字符串是否相等(首字母),比较num个字符。
若str1>str2,返回大于0的数;若str1<str2,返回小于0的数;若str1=str2,返回0 。
int strcmp ( const char* str1,const char* str2 , size_t num ) ;
int main()
{
char* p1 = "abcdef";
char* p2 = "abcsqwer";
strncmp(p1,p2,3); //0
strncmp(p1,p2,4); //-1
return 0;
}