在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。将一个大问题分解成一个个小问题也是一种解题的思想!