系统库函数总结

一.<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';
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值