1. strlen
size_t strlen ( const char * str );
注意:
strlen
的返回值是size_t,是无符号的
模拟实现:
//1.计数器法
int my_strlen(const char* p)
{
assert(p);
int count = 0;
while (*p++)
{
count++;
}
return count;
}
//2.递归法
int my_strlen(const char* p)
{
assert(p);
if (*p)
{
return 1 + my_strlen(p + 1);
}
else
{
return 0;
}
}
//3.指针-指针法
int my_strlen(const char* p)
{
assert(p);
char* start = p;
while (*p != '\0')
{
p++;
}
return p - start;
}
2. strcpy
char * strcpy ( char * destination, const char * source );
注意:
- 会将源字符串中的 ‘\0’ 拷贝到目标空间
- 目标空间必须足够大
// 模拟实现 strcpy
char* my_strcpy(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest++ = *src++)
{
;
}
return ret;
}
3. strcat
char * strcat ( char * destination, const char * source );
模拟实现
//模拟实现 strcat
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ret = dest;
while (*dest != '\0')
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
4. strcmp
int strcmp ( const char * str1, const char * str2 );
模拟实现
//模拟实现 strcmp
int my_strcmp(const char* str1, const char* str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
5. strstr
const char * strstr ( const char * str1, const char * str2 );
模拟实现
// 模拟实现 strstr 参考代码
char* my_strstr2(const char* str1, const char* str2)
{
assert(str1 && str2);
char* s1 = NULL;
char* s2 = NULL;
char* cur = (char*)str1;
while (*cur)
{
s1 = cur;
s2 = (char*)str2;
while (*s1 && *s2 && *s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == '\0')
return cur;
cur++;
}
return NULL;
}
长度受限字符串函数
- 对指定的长度进行相应处理
6. strtok
char * strtok ( char * str, const char * delimiters );
- 根据分隔符分块提取字符串
strtok
会修改原串,应创建临时拷贝进行处理strtok
第一个参数为NULL
时,接着上次操作完成的位置查找
int main()
{
char arr[] = "xrw@gmail.com";
char* p = "@.";
char tmp[30] = { 0 };//临时拷贝,防止原串被修改
strcpy(tmp, arr);
char* ret = NULL;
for (ret = strtok(tmp, p); ret != NULL; ret = strtok(NULL, p))
{
printf("%s\n", ret);
}
return 0;
}
7. strerror
char * strerror ( int errnum );
- 参数为错误码
- 当库函数调用失败时,错误信息存在
errno
这个变量中 - 如果有多次错误,错误码会被覆盖
strerror
可将这个errno
中的错误码翻译成错误信息- 返回值为错误信息的地址
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
//如果打开的文件不存在,屏幕上打印 No such file or directory
}
- 函数
perror
可直接打印信息,参数为自定义前缀
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{ perror("错误信息");
}