[置顶] C语言中自己写几个简单的库函数

       在C语言的学习中我们总会遇到一些看似看简单的问题,比如求字符串的长度,判断一个字符串中是否包含一个给定的子字符串,又或者怎么将一个字符串逆序输出,甚至是部分逆序输出,这些问题看似都挺简单,因为我们早已经习惯了使用库函数,求一个字符串的长度,用strlen()函数,不需要敲几个代码就可以得到结果,当然这也没什么问题,毕竟库函数设计出来就是给人用的,不过有时候你若闲没什么事情做得话,不妨去看看库函数,它们是如何定义的,它们又是如何使用的,库函数中的代码都是经过了验证,并且是通过一种很简便的代码形式给出来的,因此这样的代码值得我们多去看一看!当然如果你能在没事的时候自己想着去实现以下一些库函数,对于你而言还是很有用的,毕竟我们可以模仿一下大师是如何写代码的。

       下面是两个小例子:(要求不能使用库函数),既然给出了要求不能使用库函数,最简单的方法就是自己实现一个库函数,这也是所有人都会想到的一个方法。

       首先这是一道关于查找子字符串的例子,原题是在屏幕上输入内容,如果输入的一行中包含有一个给定的子字符串的话,就将这一行内容在输出一遍,否则就不输出。(不能使用库函数strstr())

以下是我测试用的代码:


#include<stdio.h>
#include<assert.h>
#define LINE_MAX 100
const char *  Find_Sub_Str(const char *str,const char * substr)
{
	const char *pstr = str;
	const char *psub = substr;
	const char * start = NULL;             //记录开始时候的位置
	int i = 0;
	assert(str);
	/*assert(substr);*/
	if (*psub =='\0')
	{
		return pstr;
	}
	while (*pstr)
	{
		start = pstr;
		while ((*pstr)&&(*psub)&&(*pstr == *psub))
		{
			pstr++;
			psub++;
		}
		if (*psub == '\0')
		{
			return start;
		}
		else
		{
			pstr = start + 1;
			psub = substr;
		}
	}
	return NULL;
}
int Get_Arr(char arr_line[], int limit)
{
	int i = 0;
	char ch;
	while ((--limit)  &&  (ch = getchar())  && (ch!= '\n') && (ch != EOF))
	{
		arr_line[i++] = ch;
	}
	if (ch=='\n')
	{
		arr_line[i++] = '\n';
	}
	arr_line[i] = '\0';
	return i;
}
int main()
{
	char arr[LINE_MAX];
	while (Get_Arr(arr,LINE_MAX))
	{
		if (Find_Sub_Str(arr, "love"))
		{
			printf("%s", arr);
		}
	}
	return 0;
}

测试结果如下:

           接下来是一道字符串逆序的问题,但又不是单纯的字符串逆序,原题是:将给输入student  a  am  i ,要求输出结果为i  am  a  student ,要求不能够使用库函数。

此题有一种巧妙地思路就是先将原来的字符串整个逆序,得到i ma  a  tneduts,然后将里面的每一个的单词逆序输出,为了方便我们可以封装一个逆序字符串的函数,第一次调用逆序整个字符串,之后调用逆序里面的每一个单词。

以下是我测试用的代码:

#include<stdio.h>
#include<assert.h>
void reverse_str(char *start, char *end)                   //定义逆置字符串函数
{
	char temp ;
	assert(start );
	assert(end );
	while (start<end)
	{
		temp = *start;
		*start = *end;
		*end = temp;
		start++;
		end--;
	}
}
char * Get_Reverse(char arr[], int len)              //逆置字符数组内容的实现
{
	char *Pchar = arr;
	char *left = NULL;
	char *right = NULL;
	int WordStart = 0;
	int WordEnd = -2;
	int i = 0;
	left = arr;
	right = arr + len - 2;
	reverse_str(left, right);
	for ( i = 0; i < len; i++)
	{
		if(arr[i]==' '||arr[i]=='\0')
		{
			WordStart = WordEnd + 2;
			WordEnd = i - 1;
			reverse_str(arr+WordStart, arr+WordEnd);
		}
	}
	return Pchar;
}
int main()
{
	char arr[] = "student a am i";
	int length = 0;
	char *p = NULL;
	length = sizeof(arr) / sizeof(arr[0]);
	p = Get_Reverse(arr, length);
	printf("%s", p);
}

      此题采用先整体在部分的思想,在以后的学习中会用到。具体的实现倒是不难,逆置的实现说到底还是交换的思想,,定义两个变量left和right,分别指向左边和右边,第一个内容和最后一个内容交换,一直到交换到left大于等于right。将一个大问题分解成一个个小问题也是一种解题的思想!


你可能感兴趣的:([置顶] C语言中自己写几个简单的库函数)