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

来源:互联网 发布:淘宝电器商城 编辑:程序博客网 时间:2024/06/06 01:02

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

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

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

以下是我测试用的代码:


#include<stdio.h>#include<assert.h>#define LINE_MAX 100const 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。将一个大问题分解成一个个小问题也是一种解题的思想!


1 0
原创粉丝点击