題目名稱:根據關鍵字進行字符串拷貝
Description
把源字符串拷貝到目的字符串,如果指定關鍵字,則以該關鍵字結束(不包括關鍵字本身),如果拷貝失敗,則得到空串。
具體要求:實現如下函數原型SafeStrcpy2KeyWord(),並在代碼中調用該函數實現上述功能。該函數的實現要考慮各種可能的參數取值,以確保程序不出現崩潰。
int SafeStrcpy2KeyWord(char* pDestBuffer, //拷貝的目的地地址
char* pSourceString, //拷貝的源地址
int nDestBufferSize, //拷貝的目的地緩衝區長度
char* szKeyWord); //指定關鍵字符串
返回值:所拷貝的字符串長度。如果拷貝失敗,則返回0。
Input
輸入包含多組數據,以EOF結束
每組數據第一行爲不含空格的源字符串,長度小於256;接下來的一行或多行都是關鍵字串(長度小於16),一直到END結束。“NULL”表示關鍵字串爲空,此時輸出的拷貝後的長度應爲0,拷貝後的字符串爲空串(也用”NULL”表示,見下文)。
Output
對於每組數據輸出拷貝的長度和拷貝後的目的字符串,以空格分隔。如果該目的字符串爲空,則用”NULL”表示。
Sample Input
/home/tony/work_server/1/rtest/relayer.out
/
/t
/1/r
.
NULL
END
Sample Output
0 NULL
5 /home
22 /home/tony/work_server
38 /home/tony/work_server/1/rtest/relayer
0 NULL
Source (參考代碼)
#include<stdio.h>
#include<string.h>
#define MAX_TEXT_LEN 258
#define MAX_PAT_LEN 18
int KMPSingleMatch(char* pText,char* pPat)
{
int patlen = 0,textlen = 0,i = 0,k = 0;
int prefix[MAX_PAT_LEN] = { 0 };
if(NULL == pText || NULL == pPat) return 0;
patlen = strlen(pPat);
if(0 == patlen) return 0;
for(i = 1;i < patlen;++i)
{
for(;k > 0 && pPat[k] != pPat[i];k = prefix[k-1]);
if(pPat[k] == pPat[i]) ++k;
prefix[i] = prefix[k-1];
if(0 == k || i + 1 == patlen || pPat[k] != pPat[i+1]) prefix[i] = k;
}
textlen = strlen(pText);
for(i = 0,k = 0;i < textlen;++i)
{
for(;k > 0 && pPat[k] != pText[i];k = prefix[k-1]);
if(pPat[k] == pText[i]) ++ k;
if(k == patlen) return i - patlen + 1;
}
return -1;
}
int SafeStrcpy2KeyWord(char* pDestBuffer,char* pSourceString,int nDestBufferSize,char* szKeyWord)
{
int pos = 0,srclen = 0,i = 0;
if(NULL == pDestBuffer) return 0;
if(NULL == szKeyWord || NULL == pSourceString) { *pDestBuffer = 0;return 0; }
srclen = strlen(pSourceString);
pos = KMPSingleMatch(pSourceString,szKeyWord);
if(-1 != pos) srclen = pos;
if(srclen >= nDestBufferSize) { *pDestBuffer = 0;return 0; }
pDestBuffer[srclen] = 0;
if(pDestBuffer == pSourceString) return srclen;
if(pSourceString > pDestBuffer)
{
for(i = 0;i < srclen;++i) *pDestBuffer++ = *pSourceString++;
}
else
{
pDestBuffer += srclen - 1;pSourceString += srclen - 1;
for(i = 0;i < srclen;++i) *pDestBuffer-- = *pSourceString--;
}
return srclen;
}
int main()
{
char source[MAX_TEXT_LEN],keystr[MAX_PAT_LEN],dest[MAX_TEXT_LEN];
int res = 0;
while(EOF != scanf("%s",source))
{
getchar();
while(1)
{
gets(keystr);
if(0 == strcmp(keystr,"END")) break;
if(0 == strcmp(keystr,"NULL")) keystr[0] = 0;
res = SafeStrcpy2KeyWord(dest,source,MAX_TEXT_LEN,keystr);
if(0 == res) printf("0 NULL/n");
else printf("%d %s/n",res,dest);
}
}
return 0;
}
注:該代碼來自參賽選手北京瑞星研發工程師曾劍傑,被“頂嵌杯”專家評審組公認爲符合工程化的高質量代碼。