啦啦啦-根据关键字进行字符串拷贝


实验作业-根据关键字进行字符串拷贝

问题描述: 把源字符串拷贝到目的字符串:
如果指定关键字,则以该关键字结束(不包括关键字本身) 
如果拷贝失败,则得到空串。
 

具体要求:实现如下函数原型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.简单的模式匹配。

最后:特别感谢舍友。

本站声明
本文转载自:http://www.cnblogs.com/-szm/p/5052752.html     作者:_arther     发布日期:2015/12/16     本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。


 
© 2014-2017 ITdaan.com 粤ICP备14056181号