C语言指针初步理解与应用
指针就是指向地址的变量,而C语言中的数组本质上也是一系列有序的地址
利用好二者的关系可以巧妙的解答一些OJ题目。
题目描述
已知 strstr 函数有从长字符串中返回需要查找的短字符串的第一次出现位置的功能
试编写一个能够返回长字符串中以某短字符串为分隔的其他字符串的函数。
样例输入:
qwerwwer
w
样例输出:
q
er
er
长字符串长度不超过10^4,短字符串不超过10
注:由于是初步理解和应用,暂不考虑长字符串中有空白符的情况(实际上没有差别)
解释:qwerwwer先输入代表长字符串 w后输入代表短字符串
以w作分割,整个长字符串分为了4部分,q,er,’’,er。所以最终输出时我们得到了四行结果。
实际作用
其他函数中拥有类似功能的函数,spilt。
难点分析
1、利用strstr函数找到的是 第一次短字符串 出现的位置之后的部分难以考虑。
2、如何相反方向的输出不为需要查找的长字符串中的内容。
3、指针的工作原理是怎么样巧妙的理解的(指针是C语言的魅力所在,作为一个萌新深有体会)
解题思路
1、需要用到的函数以及头文件:字符串中查找字符串 (strstr()) 、读取未知长度的字符串同时需要结束符(gets())、读取短字符串的长度(strlen()),以及与他们对应的头文件。
2、获得需要输出部分字符的办法:数组的本质是连续的地址,指针的本质是地址。设一个在过程中和数组地址对应的指针变量,不断利用取值符号*对其取值输出,末尾带上换行即可。
3、strstr()函数返回值的本质是一个地址,即相应字符串第一次出现的地址,如果没有找到相应字符串,则返回NULL。
所以现在有了这三步的铺垫,这个题目已经不需费多少力气了。
标准代码
#include<stdio.h>
#include<math.h> //这里是我的陋习,任何题目的头文件都会带上math.h,原意是方便任何时候调用函数
#include<string.h>
char chang[10010]; //chang即长数组,duan即短数组
char duan[11]; //由于结束符'\0'的存在,短字符数组多设一位
char *p,*p1; //两个指针变量用于记录数组输出时的始末位置
int l; //l长度记录短字符长度
int main()
{
gets(chang);
gets(duan);
l=strlen(duan);
p1=s; //p1=s就是明显的建立数组与指针的联系,记录下第一次输出时的初始位置
while(1)
{
p=strstr(p1,duan); //输入数组的本质是输入数组的第一个元素的地址
if(p==NULL) //p用于记录从p1开始的数组第一次出现段数组的地址,即末位置
{
printf("%s\n",p1); //找不到时,剩下的都是被分割掉的部分
break;
}
for(;p!=p1;p1++)
printf("%c",*p1); //找到的时候需要由始及末的遍历,也许可以用puts之类的函数(没实验过)
printf("\n");
p1=p+l;
}
return 0;
}
小结
还是那句经典的话,指针是C语言的精华,也是C语言经久不衰的魅力所在
数组的内涵其实就是内存中的连续地址,目前我对于指针的应用也都是在数组中探索
计划下一次能得出二维数组中由一列排序带动另一列排序的方法。
(1,3)(2,5)(3,7)(4,6)就是一种由第一列 1、2、3、4带动第二列 3、5、7、6排序的例子