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


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

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

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

    最后:特别感谢舍友。

  • 相关阅读:
    java 中 堆、栈的区别(转)
    斐波那契数列(关于递归)
    .NetCore使用Hangfire
    大话西游系统文件分析
    VC游戏开发图片镂空
    华硕XTion Pro开发环境配置
    TweenMax 参数说明(中文翻译)
    程序员的追求
    最近得到的
    mvc的json
  • 原文地址:https://www.cnblogs.com/-szm/p/5052752.html
Copyright © 2020-2023  润新知