字符串的查找
题目描述:
给定一个字符串A,要求在A中查找一个子串B的位置
如A = “ABCDEF”,B = “CD”,返回3.从3开始。
相当于库函数strstr。
方法一:
#include<stdio.h>
#include<string.h>
//匹配函数
int match(char *str,char *sub)
{
while(*sub != '\0')
{
while(*str++ != *sub++)
return 0;
}
return 1;
}
int Strstr(char * str,char* substr)
{
if(str == NULL || substr == NULL)
return -1;
if(strlen(str) < strlen(substr))
return -1;
int i = 0;
while(*str != '\0')
{
if(match(str+i,substr))
{
return i+1;
}
i++;
}
return -1;
}
int main()
{
char str[10] = "abcdef";
char sub[5] = "bc";
int cout;
cout = Strstr(str,sub);
if(-1 == cout)
printf("not find\n");
else
printf("%d\n",cout);
return 0;
}
代码中要注意一些边界值或者非法输入的处理,保证代码的高质量,可以从功能测试、边界测试、负面测试三方面设计测试用例,以确保代码的完整性。
也可以使用循环嵌套的方法。
方法二:
#include <stdio.h>
#include <string.h>
int strstr(char * str,char * sub)
{
if(str == NULL || sub == NULL)
return -1;
int lenstr = strlen(str);
int lensub = strlen(sub);
if(lenstr < lensub)
return -1;
int i,j;
int len = lenstr - lensub ;
for(i = 0;i<=len;i++)
{
for(j = 0;j<lensub;j++)
{
if(str[i+j]!= sub [j] )
break;
}
if (j == lensub) //如果全部匹配说明存在
return i+1;
}
return -1;
这个题目也可以稍作改变
字符串的删除
题目描述:
给定一个字符串A,在A中找到第一次出现的字串B,并删除掉
如A= “ABCDEF”,B = “CD” ,则返回A= “ABEF”。
分析:
关键问题就是找到CD的起始位置,从而可以找到CD结束位置,然后从结束位置开始后面的值都赋给起始位置开始的值。
找到出现一次的字符
题目描述:
在一个字符串中找到第一个只出现一次的字符,如输入abaccdeff,则输出b。
分析:最先想到的就是hashtable,字符作为key ,次数作为value,先统计,再遍历找到第一个value= 1的项,返回它的key。
#inclue <stdio.h>
#define SIZE 256
char Find(char * str)
{
int hashtable[SIZE] = {0};
char * temp = str;
while(*temp != '\0')
hashtable[*temp++]++;
while(*str != '\0')
{
if(hashtable[*str] == 1)
return *str;
str++;
}
return '\0';
}
如果你觉得数组占用内存太大,那么可以缩小,其实就是加一个映射,把str[i] - ‘a’。范围变小,其他的都没有变化。
字符串拷贝strcpy
题目描述:实现库函数strcpy
原型声明:char * strcpy(char * dest,char * src);
功能:把src所指字符串复制到dest所指数组中。
char * strcpy(char * dest ,char * src)
{
if(dest == src)
return dest;
assert(dest != NULL && src != NULL);
char * temp = dest;
while((*dest ++ = *src++) !='\0')
return temp;
}