啦啦啦-根據關鍵字進行字符串拷貝,關鍵字字符串拷貝
實驗作業-根據關鍵字進行字符串拷貝
問題描述: 把源字符串拷貝到目的字符串:
如果指定關鍵字,則以該關鍵字結束(不包括關鍵字本身)
如果拷貝失敗,則得到空串。
具體要求:實現如下函數原型SafeStrcpy2KeyWord(),並在代碼中調用該函數實現上述功能。該函數的實現要考慮各種可能的參數取值,以確保程序不出現崩潰。int SafeStrcpy2KeyWord(char* pDestBuffer, //拷貝的目的地地址
char* pSourceString, //拷貝的源地址
int nDestBufferSize, //拷貝的目的地緩沖區長度
char* szKeyWord); //指定關鍵字符串
返回值:所拷貝的字符串長度。如果拷貝失敗,則返回0。
解決方案要求:
輸入參數
輸入包含多組數據,以END結束
每組數據第一行為不含空格的源字符串,長度小於256;接下來的一行或多行都是關鍵字串(長度小於16),一直到END結束。“NULL”表示關鍵字串為空,此時輸出的拷貝後的長度應為0,拷貝後的字符串為空串(也用”NULL”表示,見下文)。
輸出參數
對於每組數據輸出拷貝的長度和拷貝後的目的字符串,以空格分隔。如果該目的字符串為空,則用”NULL”表示。
參考樣例
樣例輸入:
/home/tony/work_server/1/rtest/relayer.out
/ 以/為關鍵字
/t
/1/r
.
NULL
END //分別以/,/t,/1/r,.,NULL為關鍵字進行拷貝
樣例輸出:
0 NULL
5 /home
22 /home/tony/work_server
38 /home/tony/work_server/1/rtest/relayer
0 NULL
1 #include<iostream>
2 #include<cstring>
3 #include<string>
4 using namespace std;
5
6 int SafeStrcpy2KeyWord(char* pDestBuffer, //拷貝的目的地地址
7 char* pSourceString, //拷貝的源地址
8 int nDestBufferSize, //拷貝的目的地緩沖區長度
9 char* szKeyWord); //指定關鍵字符串
10
11 int main(){
12 string s1, s2, s3 = "";
13 cin >> s1;//源字符串
14 while (cin >> s2){
15 if (s2 == "END"){
16 system("PAUSE");
17 return 0;
18
19 }
20
21 if (s2 == "NULL"){
22 cout << "0 NULL" << endl;
23 continue;
24 }
25 int m = SafeStrcpy2KeyWord(&s3[0], //拷貝的目的地地址
26 &s1[0], //拷貝的源地址
27 255, //拷貝的目的地緩沖區長度
28 &s2[0]); //指定關鍵字符串
29 }
30
31 return 0;
32
33 }
34 int SafeStrcpy2KeyWord(char* pDestBuffer, //拷貝的目的地地址
35 char* pSourceString, //拷貝的源地址
36 int nDestBufferSize, //拷貝的目的地緩沖區長度
37 char* szKeyWord)//指定關鍵字符串
38 {
39 int len1 = strlen(pSourceString), len2 = strlen(szKeyWord);
40 // 源長為 len1
41 // 關鍵字符串長 len2
42 int i = 0, j = 0;
43 while (i < len1 && j < len2){
44 if (pSourceString[i] == szKeyWord[j]){
45 ++i; ++j;
46 }
47 else {
48 j = 0; ++i;//j復位,i後移一位
49 }
50
51 }
52 if (j > 0) {
53 pDestBuffer = (char*)malloc(sizeof(char) *nDestBufferSize);//申請空間
54 //i-len2為匹配成功的起始位置 ,也是需要復制的字符串的長度
55 for (int e = 0; e < i - len2; e++){//逐一賦值
56 pDestBuffer[e] = pSourceString[e];
57 }
58 if (i - len2 != 0){
59 cout << i - len2 << " ";
60 for (int k = 0; k < i - len2; k++)
61 cout << pDestBuffer[k];
62
63 cout << "\n";
64 free(pDestBuffer);
65 return i - len2;
66 }
67
68 if (i - len2 == 0){
69 cout << "0 NULL" << endl;
70 }
71 return i - len2;
72 }
73 if (j == 0){
74 cout << "0 NULL" << endl;
75 return i - len2;
76 }
77 }
View Code
基本的實現過程使用到了
1.字符指針,如char *p ="abcs",p 其實指向這個字符串常量/字符數組的第一個字符的地址。
2.strlen(s)函數,求串長,如strlen(p) = 4;
3.指針指向一個string 變量,http://www.cplusplus.com/reference/cstdlib/malloc/
http://cpp.sh/
如 : string ss = "";//空串
char * k = &ss[0];
k =(char*) malloc(sizeof(char)*size);//申請空間,size為所要賦值的字符個數,取大一點
for(int i =0; i < 100;i++)
k[i] = 'a';
cout<<k<<endl;
free(k);//釋放空間
4.簡單的模式匹配。
最後:特別感謝捨友。