您的位置:首页 > 编程语言 > C语言/C++

C语言中自己写几个简单的库函数

2016-04-06 21:39 447 查看
在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。将一个大问题分解成一个个小问题也是一种解题的思想!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: