字符串的查找
題目描述:
給定一個字符串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;
}