程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 啦啦啦-根據關鍵字進行字符串拷貝,關鍵字字符串拷貝

啦啦啦-根據關鍵字進行字符串拷貝,關鍵字字符串拷貝

編輯:C++入門知識

啦啦啦-根據關鍵字進行字符串拷貝,關鍵字字符串拷貝


實驗作業-根據關鍵字進行字符串拷貝

問題描述: 把源字符串拷貝到目的字符串:
如果指定關鍵字,則以該關鍵字結束(不包括關鍵字本身) 
如果拷貝失敗,則得到空串。
 

具體要求:實現如下函數原型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.簡單的模式匹配。

最後:特別感謝捨友。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved