一.<string.h>
1.strlen
功能:统计字符串str中字符的个数(不包括终止符'\0')
unsigned int strlen(char* str)
{
int len = 0;
while (*str)
{
++len;
++str;
}
return len;
}
2.strcat
功能:把str2接到str1后面,str1最后面的'\0'被取消
char* strcat(char* dest, char* src)
{
if (dest == NULL || src == NULL)
return NULL;
char* tmp = dest;//记录字符串首地址
while (*dest)
++dest;
while ((*dest++ = *src++) != '\0');
return tmp;
}
3. strncat(易错)
功能:将src所指字符串前n个字符接到dest后面
注:如果src前n个字符都是'\0',那么只会把src中第一个'\0'复制过去
char* strncat(char* dest, char* src, int n)
{
if (dest == NULL || src == NULL)
return NULL;
char* tmp = dest;//记录首地址
while (*dest)
++dest;
while (n-- && *src != '\0')
*dest++ = *src++;
/*Don't forget this line*/
*dest = '\0';
return tmp;
}
4.strcpy
功能:将src所指字符串复制到dest
char* strcpy(char* dest, char* src)
{
if (dest == NULL || src == NULL)
return NULL;
char* tmp = dest;//记录首地址
while ((*dest++ = *src++) != '\0');
return tmp;//注意返回的是tmp,写错过两次了
}
5.strncpy
功能:将src所指字符串前n个字符复制到dest中
char* strncpy(char* dest, char* src, int n)
{
if (dest == NULL || src == NULL)
return NULL;
char* tmp = dest;
while (n--)
{
if (*src == '\0')
{
*dest++ = '\0';
}
else
{
*dest++ = *src++;
}
}
return tmp;
}
这样编写的原因是基于对系统库函数调用的实验:
6.strcmp
功能:比较两个字符串str1和str2,如果str1<str2返回负数,str1=str2返回0,str1>str2返回正数
int strcmp(char* str1, char* str2)
{
while (*str1 && *str2 && (*str1 == *str2))
{
str1++;
str2++;
}
return *str1 - *str2;
}
7.strncmp(易错)
功能:两个字符串str1和str2最多前n个字符的比较
int strncmp(char* str1, const char*str2, int n)
{
while (n-- && *str1 && *str2 && (*str1 == *str2))
{
if (n == 0)
break;
str1++;
str2++;
}
return *str1 - *str2;
}
8. strchr
功能:找出str所指的字符串中第一次出现字符ch的位置,返回该位置的指针,如果找不到则返回空指针
char* strchr(char*str, int ch)
{
if (str == NULL)
return NULL;
//这个以及下面相同的if语句是为了查找ch为'\0'的情况
if (*str == '\0' && ch == 0)
return str;
while (*str != '\0')
{
if(*str == ch)
return str;
str++;
if (*str == '\0' && ch == 0)
return str;
}
return NULL;
}
9. strstr
功能:找出str2字符串在str1字符串中第一次出现的位置(不包括终止符'\0'),返回该位置的指针,如找不到返回空指针
char* strstr(char* str1, char*str2)
{
//此处采用简单模式匹配算法
int i, j, k;
i = j = k = 0;
while (str1[i] != '\0' && str2[j] != '\0')
{
if (str1[i] == str2[j])
{
i++;
j++;
}
else
{
k++;
i = k;
j = 0;
}
}
if (str2[j] == '\0')
return &str1[k];
return NULL;
}
二、<stdlib.h>
1.atoi
功能:字符串转换成整数
易错点:循环变量i没有赋初值
/*实现字符串向整数的转换。字符串开头直接跳过空白字符和tab,如果有+-号则判断是正负,然后+-号后面是数字字符的话则转换成数字,不是则退出。*/
int atoi(char* nptr)
{
int sign;
int i, num;
sign = 1;
i = 0;
//跳过空格
while (nptr[i] == ' ' || nptr[i] == '\t' || nptr[i] == '\n')
++i;
//判断正负
if (nptr[i] == '+')
{
++i;
}
else if(nptr[i] == '-')
{
++i;
sign = -1;
}
num = 0;
while (nptr[i] >= '0' && nptr[i] <= '9')//写错过,写成了nptr[i]!='\0'
{
num = num * 10 + nptr[i] - '0';
++i;
}
return sign * num;
}
2.itoa(易错)
功能:整数转换成字符串
【易错点】
(1)漏掉符号判断步骤
(2)没有取正 value = -1*value或者没有判断0;
(3)字符串末尾没加'\0'
void itoa(int value, char* buffer)
{
int i;
char stack[maxSize];
int top = -1;
i = 0;
//判断符号,易错:容易忘记判断正负
if (value < 0)
{
buffer[i++] = '-';
value = -1 * value;
}
else if (value == 0)
buffer[i++] = '0';
while (value)
{
stack[++top] = value % 10 + '0';//易错:容易漏掉'0'
value /= 10;
}
while (top != -1)
{
buffer[i++] = stack[top--];
}
buffer[i] = '\0';
}