Problem Statement
For a given source string and a target string, you should output the first
index(from 0) of target string in source string.If target does not exist in source, just return -1.(寻找目标字符串在源字符串中出现的位置)
Example
If source = "source" and target = "target", return -1.
If source = "abcdabcdefg" and target = "bcd", return 1.(从零开始,bdc在第二位置,故输出1);
int strStr(char* haystack, char* needle) {
if(haystack ==NULL|| needle ==NULL)
return -1;
const int strl_h=strlen(haystack);
const int strl_n=strlen(needle);
int i,j=0;
for (i=0;i<strl_h-strl_n+1;i++)
{
for (j=0;j<strl_n;j++)
{
if(haystack[i+j]!=needle[j])
//如果找到相同的字符,则继续查找下一个相同的字符,直到查找到所有相同的字符,此时j=strl_n;
//如果第一个字符不相同,则break,跳出第二个for循环
break;
}
if (j==strl_n)
return i;
}
return -1;
}
形参使用char 型指针变量,调用开始形参指向字符数组的首地址。
- 整理课程列表
冬瓜同学平时十分喜欢在实验楼学习新课程,每学完一节课就会将其记下。当学会的编程语言多了,就想整理汇总一下,看看自己的技术栈。为了有序排列所有的编程语言,冬瓜决定使用冒泡排序对其进行排列。而字符串的比较方法使用的是字典序。
#include<stdio.h>
#include<string.h>
char *courses[]={"C","C++","PHP","COBOL","ASP.NET","C#","JAVA","BASIC","PASCAL","ASP"};
void sort(char *p[],int n)
{
char *tmp;
int i,j,k;
for(i=0;i<n;++i){
k=i;
for(j=i;j<n;++j){
if(strcmp(p[j],p[k])<0)
//查找最小的字符串,首先以第一个作为最小字符串,然后以此比较找到最小的然后将1号字符串与找到的
//最小的字符串交换,结束第一轮比较。然后以第二个字符串作为最小的以此次比较查找到第二小的字符串,
//然后将第二小字符串与2号位字符串交换,以次排序。
k=j;
}
// if(k!=j)
{
tmp=p[k];
p[k]=p[i];
p[i]=tmp;
}
}
}
int main()
{
int n=sizeof(courses)/sizeof(char *);
sort(courses,n);
int i;
for(i=0;i<n;++i)
{
printf("%s\n",courses[i]);
}
return 0;
}
注意:数组指针与指针数组
char *courses[3]
,由于[]的优先级高于*,因此courses先与[]结合构成数组,数组元素类型为(char *),故其为指针数组。
char (*courses)[3]
,与courses结合表明其是一个指针,在于后面的[3]结合,申明其为一个包含4个元素数组的指针。故其为数组指针,即指向数组的指针。
下图是二者在内存中区别:
参考文献
【1】实验楼-整理课程列表 (https://www.shiyanlou.com/contests/lou4/console)
【2】C语言指针数组和数组指针(http://c.biancheng.net/cpp/html/476.html)
【3】实验楼-经典算法解题实战 字符串(一)(https://www.shiyanlou.com/courses/492)