实验作业-根据关键字进行字符串拷贝
问题描述: 把源字符串拷贝到目的字符串:
如果指定关键字,则以该关键字结束(不包括关键字本身)
如果拷贝失败,则得到空串。
具体要求:实现如下函数原型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 }
基本的实现过程使用到了
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.简单的模式匹配。
最后:特别感谢舍友。