简要
在C语言中,有一系列用于操作字符串的函数,称之为字符串函数,使用时可以调用<string.h>头文件(也有一系列字符分类函数,使用时调用<ctype.h>头文件>。
strlen()函数
首先我们要明白,一个字符串是以'\0'为结束标志,strlen()函数就是返回字符串在'\0'之前的字符的个数(千万记住,不含'\0'),而且函数的返回值是size_t类型。
在msdn上给出的解释如上,传入的参数是一个常量指针,表明指针指向的内容不可以修改,因为我们只是计算一下这个字符串的长度,自然也不能擅自修改字符串,所以用const来修饰。
下面,模拟实现一下strlen()函数。
1.计数器法。
size_t my_strlen1(const char* str)
{
size_t count = 0;
assert(str);
while (*str)
{
count++;
str++;
}
return count;
}
通过一个变量来记录遍历过的字符,到'\0'停止,计算出字符串的有效长度。
2.递归
size_t my_strlen2(const char* str)
{
assert(str);
if (!*str)
return 0;
else
return 1 + my_strlen2(str + 1);
}
3.指针-指针
size_t my_strlen3(char* str)
{
assert(str);
char* start = str;
while (*start)
{
start++;
}
return start - str;
}
strcpy()函数
使用这个函数,需要保证目标空间足够大,目标空间可修改。这是msdn对strcpy()的解释。
可以看出strcpy()函数的返回值类型是char*。
实现strcpy()函数
char* my_strcpy(char* str1, const char* str2)
{
char* ret = str1;
assert(str1 && str2);
while (*str1++ = *str2++);
return ret;
}
strcat()函数
要求目标字符串内有'\0',不然无法追加,而且目标空间要足够大。
strcat()函数的实现
char* my_strcat(char* str1, const char* str2)
{
char* ret = str1;
assert(str1 && str2);
while (*str1)
{
str1++;
}
while (*str1++ = *str2++);
return ret;
}
strstr()函数
这个函数的返回值是字符串2在字符串1中第一次出现的位置(指针的形式)。
先来看一下这个函数的效果。
如果找不到,就会返回一个NULL。
strstr()函数的实现
char* my_strstr(const char* str1, const char* str2)
{
char* p = str1,*s1,*s2;
if (!*str2)
return (char*)str1;
while (*p)
{
s1 = p;
s2 = (char*)str2;
while (*s1 && *s2 && !(*s1 - *s2))
s1++, s2++;
if (!*s2)
return p;
p++;
}
return NULL;
}
strtok()函数
这个函数,如果他的第一个参数不是NULL,那么它将找到str中第一个标记,strtok函数会保留他的位置,如果是NULL,函数将在同一个字符串被保存的位置开始,查找下一个标记。如果没有标记了,就返回NULL指针。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
char str[] = "66612.2@com";
char* sep1 = ".@";
char* p = NULL;
for (p = strtok(str, sep1); p != NULL; p = strtok(NULL, sep1))
{
printf("%s\n", p);
}
return 0;
}
strerror()函数
这个函数是把参数部分错误码对应的错误信息的字符串地址返回。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%s\n", strerror(i));
}
return 0;
}