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

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

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

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

最后:特别感谢舍友。

原文地址:https://www.cnblogs.com/-szm/p/5052752.html