目录
strlen
size_t strlen ( const char * str );
strlen函数是求字符串的长度,它返回的是字符串\0之前的字符个数,返回值是size_t的,前面我们已经模拟实现过strlen函数,这里不在介绍。
strcpy
char* strcpy(char * destination, const char * source );
strcpy是字符串拷贝函数,将源字符串拷贝到目标空间中,\0也会拷贝过去,目标空间要确保足够大,以前已经介绍过模拟实现strcpy函数,这么不在介绍。
strncpy
char * strncpy ( char * destination, const char * source, size_t num );
strncpy是有长度限制,拷贝到目的空间num个。
strcat
char * strcat ( char * destination, const char * source );
strcat是字符串追加\连接函数,源字符串必须\0结束,目标空间足够大,可修改。
strncat有长度限制
模拟实现strcat
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
//1.找到目标字符串的末尾\0
while (*dest != '\0')
{
dest++;
}
//2.追加源字符串到\0
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
//strcat--字符串连接/追加
char arr1[20] = "abc"; //追加的时候20不能省略
//char arr2[] = { 'd', 'e', 'f' };
char arr3[] = { 'd', 'e', 'f','\0' };
//strcat(arr1, "def");
//strcat(arr1, arr2);//错误,因为arr2中没有\0
my_strcat(arr1, arr3);//模拟实现
printf("%s\n", arr1);
return 0;
}
strcmp
int strcmp ( const char * str1, const char * str2 );
strcmp是字符串比较函数,比较的是字符串的内容,不是长度
strncmp有长度限制
标准规定:
第一个字符串大于第二个字符串,则返回大于0的数字
第一个字符串等于第二个字符串,则返回0
第一个字符串小于第二个字符串,则返回小于0的数字
int main()
{
//strcmp 是比较字符串的,比较的是字符串的内容,不是长度
char arr1[] = "abcq";
char arr2[] = "abc";
int ret = strcmp(arr1, arr2);
if (ret == 0)
{
printf("=\n");
}
else if (ret < 0)
{
printf("<\n");
}
else
{
printf(">\n");
}
printf("%d\n", ret);
return 0;
}
模拟实现strcmp
int my_strcmp(const char* s1, const char* s2)
{
assert(s1 && s2);
while (*s1 == *s2)
{
if (*s1 == '\0')
return 0;
s1++;
s2++;
}
return *s1 - *s2;
}
int main()
{
//strcmp 是比较字符串的,比较的是字符串的内容,不是长度
char arr1[] = "abcq";
char arr2[] = "abcwq";
int ret = my_strcmp(arr1, arr2);
if (ret < 0)
printf("<\n");
else if (ret == 0)
printf("=\n");
else
printf(">\n");
return 0;
}
strstr
char * strstr ( const char *, const char * );
strstr在字符串中查找子字符串
int main ()
{
char str[] ="This is a simple string";
char * pch;
pch = strstr (str,"simple");
strncpy (pch,"sample",6);
puts (str);
return 0;
}
模拟实现strstr
char* my_strstr(const char*str1, const char* str2)
{
assert(str1 && str2);
//
char* s1;
char* s2;
char* cp = str1;
if (*str2 == '\0')
return str1;
while (*cp)
{
s1 = cp;
s2 = str2;
//while (*s1!='\0' && *s2 != '\0' && *s1 == *s2)
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cp;
}
cp++;
}
//找不到
return NULL;
}
int main()
{
char arr1[] = "i am good student, hehe student";
char arr2[] = "student";
//查找arr1中arr2第一次出现的位置
char *ret = my_strstr(arr1, arr2); //返回地址
if (ret == NULL)
{
printf("找不到\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
strtok
char * strtok ( char * str, const char * sep );
strtok分隔字符串
例如:192.168.2.121按点分隔,192 168 2 121
int main()
{
char arr1[] = "zpw@bitedu.tech";
char arr2[100] = { 0 };//临时数据
//zpw\0bitedu.tech\0
char sep[] = "@.";
strcpy(arr2, arr1);
char* ret = NULL;
//分割字符串
for (ret=strtok(arr2, sep); ret!=NULL; ret=strtok(NULL, sep))
{
printf("%s\n", ret);
}
//strtok(arr2, sep);
//strtok(NULL, sep);
return 0;
}
strerror
char * strerror ( int errnum );
strerror返回错误码所对应的错误信息,需要包含头文件#include <errno.h>
#include <stdlib.h>
int main()
{
FILE* pf = fopen("test.txt", "r");
//errno
//strerror - 可以返回C语言内置的错误码对应的错误信息
//
if (pf == NULL)
{
//printf("%s\n", strerror(errno)); //errno头文件在stdlib.h
perror("测试");//打印+strerror
}
else
{
printf("打开文件成功\n");
}
return 0;
}