zoukankan      html  css  js  c++  java
  • 字符串函数集

    【1】字符数组的环形移动如何实现?

    要求:函数原型如下:

    void RightLoopMove(char *pstr, unsigned short steps)

    参数1:char *pstr 表示需要移动的字符串

    参数2:unsigned short steps 表示从第几个字符开始向右移动

    返回值类型:void

    示例代码如下:

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int mystrlen(char* str)
     5 {
     6     int Length = 0;
     7     if (NULL != str)
     8     {
     9         for (;*str++ != '\0';Length += 1);
    10         return Length;
    11     }
    12     return Length;
    13 }
    14 
    15 void RightLoopMove(char *pstr, unsigned short steps)
    16 {
    17     if (NULL == pstr)
    18         return;
    19 
    20     char tmp;
    21     int len = mystrlen(pstr);
    22     steps %= len;
    23     while (steps-- > 0)
    24     {
    25         tmp = *(pstr + len -1);
    26         for (int i = len - 2;i >= 0;--i)
    27         {
    28             pstr[i + 1] = pstr[i];
    29         }
    30         pstr[0] = tmp;
    31     }
    32 }
    33 
    34 void main()
    35 {
    36     char str[] = "abcdefghijklmn";
    37     RightLoopMove(str, 4);
    38     cout << str << endl;         //klmnabcdefghij
    39     system("pause");
    40 }

    【2】如何判断一个字符串是否是回文串?

    要求:函数原型如下:

    int  IsRevStr(char *str)

    "回文数"是一种数字。如:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数。

    字符的以此类推.....

    示例代码如下:

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int mystrlen(const char *str)
     5 {
     6     int Length = 0;
     7     if (NULL != str)
     8     {
     9         for (; *str++ != '\0'; Length++);
    10         return Length;
    11     }
    12     return Length;
    13 }
    14 
    15 int  IsRevStr(char *str)
    16 {
    17     int i, len;
    18     int found = 1;
    19     if (NULL == str)
    20     {
    21         return -1;
    22     }
    23 
    24     len = mystrlen(str);
    25     for (i = 0; i < len/2; i++)
    26     {
    27         if (*(str + i) != *(str + len - i - 1))
    28         {
    29             found = 0;
    30             break;
    31         }
    32     }
    33     return found;
    34 }
    35 
    36 void main()
    37 {
    38     char *str1 = "abcdeedcba";
    39     char *str2 = "abfba";
    40     char *str3 = "liuyong";
    41     cout << IsRevStr(str1) << endl;  // 1
    42     cout << IsRevStr(str2) << endl;  // 1
    43     cout << IsRevStr(str3) << endl;  // 0
    44     system("pause");
    45 }

    【3】如何把数字字符串转换为整型数据?

    要求:函数原型如下:

    int   str2int (const   char   *str);

    示例代码如下:

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int str2int(const char *str)
     5 {
     6     int temp = 0;
     7     const char *ptr = str;          // ptr保存str字符串开头
     8     if (*str == '-'|| *str == '+')     // 若第一个字符为符号位
     9     {
    10         str++;   // 前移一位
    11     }
    12     //转换为数据
    13     while (*str != 0)
    14     {
    15         if ((*str < '0') || (*str > '9'))
    16         {
    17             break;
    18         }
    19         temp = temp*10 + (*str - '0');
    20         str++;
    21     }
    22     //若为负数
    23     if (*ptr == '-')
    24     {
    25         temp = -temp;
    26     }
    27     return  temp;
    28 }
    29 
    30 void  main()
    31 {
    32     char *str1 = "-1234";
    33     char *str2 = "1234";
    34     int data1 = str2int(str1);   
    35     cout << data1 << endl;         // -1234
    36     int data2 = str2int(str2);
    37     cout << data2 << endl;         // 1234
    38     system("pause");
    39 }

    【4】如何把整型数据转换为字符串?

    要求:函数原型如下:

    void  int2str(int data,char *str)

    示例代码如下:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 void int2str(int data, char *str)
     5 {
     6     if (NULL == str)
     7     {
     8         return;
     9     }
    10 
    11     char buf[10];
    12     int i = 0, len = 0;
    13     int temp = data < 0 ? -data : data;   // temp为n的绝对值
    14     while (temp)
    15     {
    16         buf[i++] = (temp % 10) + '0';        // 把temp每一位上的数存入buf
    17         temp /= 10;
    18     }
    19     // data的位数加一
    20     buf[i] = '\0';
    21     len = data < 0 ? ++i : i;
    22     str[i] = '\0';  // 最末位置为‘0’
    23     while (1)
    24     {
    25         --i;
    26         if (buf[len - i - 1] == '\0')
    27         {
    28             break;
    29         }
    30         str[i] = buf[len - i - 1];    // 把buf内的字符拷到字符串
    31     }
    32     
    33     if (0 == i)
    34     {
    35         str[i] = '-';   // 如果是负数,添加一个负号
    36     }
    37 }
    38 
    39 void  main()
    40 {
    41     int a = 1234;
    42     int b = -1234;
    43     char str1[10], str2[10];
    44     int2str(a, str1);
    45     int2str(b, str2);
    46     cout << str1 << endl;  // 1234
    47     cout << str2 << endl;  // -1234
    48     system("pause");
    49 }

    【5】如何对字符串进行排序?

    示例代码如下:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int mystrlen(const char * str)
     5 {
     6     int Length = 0;
     7     if (NULL != str)
     8     {
     9         for (; *str++ != '\0'; Length += 1);
    10         return Length;
    11     }
    12     return Length;
    13 }
    14 
    15 void strsort(char *str)
    16 {
    17     int i,j;
    18     int temp = 0;
    19     int num = mystrlen(str);
    20     for (i = 0; i < num; i++)
    21     {
    22         for (j = i + 1; j < num; j++)
    23         {
    24             if (str[i] > str[j])
    25             {
    26                 temp = str[i];
    27                 str[i] = str[j];
    28                 str[j] = temp;
    29             }
    30         }
    31     }
    32 }
    33 
    34 void  main()
    35 {
    36     char ch[] = "lkjhgfdsa";
    37     strsort(ch);
    38     cout << ch << endl;  // adfghjkls
    39     system("pause");
    40 }

    【6】如何把字符串中某个指定的字符删除?

    要求:函数原型如下:

    char * DeleChar(char *str,char c)

    示例代码如下:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 char * DeleChar(char *str, char c)
     5 {
     6     char *head = NULL;
     7     char *p = NULL;
     8     if (NULL == str)
     9         return NULL;
    10     head = p = str;   // 指向字符串头,准备遍历
    11     while (*p)
    12     {
    13         if (*p != c)
    14         {
    15             *str++ = *p++;
    16         }
    17         else
    18         {
    19             ++p;
    20         }
    21     }
    22     *str = '\0';
    23     return head;
    24 }
    25 
    26 void  main()
    27 {
    28     char ch[] = "agggbcabcsbddbf";
    29     DeleChar(ch, 'b');
    30     cout << ch << endl;   // agggcacsddf
    31     system("pause");
    32 }

    【7】如何找出01字符串中0与1出现的最大次数?

    要求:函数原型如下:

    void  Calculate(const char *str,int *max0,int *max1)

    示例代码如下:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 void  Calculate(const char *str, int *max0, int *max1)
     5 {
     6     int temp0 = 0;
     7     int temp1 = 0;
     8     while (*str)
     9     {
    10         if (*str == '0')
    11         {
    12             (*max0)++;
    13             if (*(++str) == '1')
    14             {
    15                 if (temp0 < *max0)
    16                 {
    17                     temp0 = *max0;
    18                 }
    19                 *max0 = 0;
    20             }
    21         }
    22         else if (*str == '1')
    23         {
    24             (*max1)++;
    25             if (*(++str) == '0')
    26             {
    27                 if (temp1 < *max1)
    28                 {
    29                     temp1 = *max1;
    30                 }
    31                 *max1 = 0;
    32             }
    33         }
    34     }
    35 
    36     *max0 = temp0;
    37     *max1 = temp1;  
    38 }
    39 
    40 void  main()
    41 {
    42     char string[] = "0101111111100000111";
    43     int max0 = 0;
    44     int max1 = 0;
    45     Calculate(string, &max0, &max1);
    46     cout << "max0:" << max0 << "max1:" << max1 << endl;   // max0:5   max1:8
    47     system("pause");
    48 }

    【8】如何从字符串的某一个位置删除指定个数的字符?

    函数原型如下:

    char  *deleteChar(char *str,int pos,int len)

    示例代码如下:

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int mystrlen(const char * str)
     5 {
     6     int Length = 0;
     7     if (NULL != str)
     8     {
     9         for(; *str++ != '\0'; Length++);
    10         return Length;
    11     }
    12     return Length;
    13 }
    14 
    15 char  *deleteChar(char *str,int pos,int len)
    16 {
    17     char *p = str + pos - 1;
    18     int tt = mystrlen(str);
    19     if ((pos < 1) || (p - str) > tt)  // pos不大于1 或者 pos不超出字符串的长度
    20         return str;
    21     if ((p + len - str) > tt)   // len大于pos后剩余的个数
    22     {
    23         *p = '\0';
    24         return str;
    25     }
    26     while (*p && *(p + len))   // len小于或者等于剩余的个数
    27     {
    28         *p = *(p + len);
    29         p++;
    30     }
    31     *p = '\0';
    32     return str;
    33 }
    34 
    35 void main()
    36 {
    37     char delstr[] = "afdfjgkglkgdg";
    38     cout << "删除前字符串:" << delstr << endl;
    39     char *dest = deleteChar(delstr, 3, 4);
    40     cout << "从第三个字符位置,删除4个字符:" << endl;
    41     cout << "删除后字符串:" << dest << endl;
    42     system("pause");
    43 }
    44 
    45 // The result of this
    46 /*
    47 删除前字符串: afdfjgkglkgdg
    48 从第三个字符位置,删除4个字符:
    49 删除后字符串: afkglkgdg
    50 */

    【9】写一个函数把字符串反转。

    函数实现及测试程序代码如下:

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4  
     5 // 字符串中每个字符的反转
     6 char* strRev(const char *str)
     7 {
     8     char *pTmp = new char[strlen(str) + 1];
     9     strcpy(pTmp, str);
    10     char *ret = pTmp;
    11     char *p = pTmp + strlen(str) - 1;
    12     while (p > pTmp)
    13     {
    14         *p ^= *pTmp;
    15         *pTmp ^= *p;
    16         *p ^= *pTmp;
    17         --p;
    18         ++pTmp;
    19     }
    20 
    21     return ret;
    22 }
    23 
    24 void  main()
    25 {
    26     char * str = "abcdef";
    27     cout << strRev(str) << endl;  // fedcba
    28     system("pause");
    29 }

    【10】写一个函数查找两个字符串中的第一个公共字符串

    函数实现及测试程序代码如下:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 int strLen(const char *str)
     5 {
     6     int len = 0;
     7     if (NULL != str)
     8     {
     9         while (*str++ != '\0')
    10         {
    11             len++;
    12         }
    13         return len;
    14     }
    15     return len;
    16 }
    17 
    18 // 两个字符串中的第一个公共子串
    19 char *commonstr(char *str1, char *str2)
    20 {
    21     int i, j, k;
    22     char *shortstr, *longstr;
    23     char *substr;
    24     if ((NULL == str1)||(NULL == str2))
    25     {
    26         return NULL;
    27     }
    28 
    29     if (strLen(str1) <= strLen(str2))
    30     {
    31         shortstr = str1;
    32         longstr = str2;
    33     }
    34     else
    35     {
    36         shortstr = str2;
    37         longstr = str1;
    38     }
    39 
    40     if (strstr(longstr, shortstr) != NULL)
    41     {
    42         return shortstr;
    43     }
    44     // 申请堆内存存放返回结果
    45     substr = (char *)malloc(sizeof(char)*(strLen(shortstr) + 1));
    46     i = strLen(shortstr) - 1;  // i = 4 = 5 - 1
    47     for (; i > 0;i--)
    48     {
    49         k = strLen(shortstr) - i; // k = 5 - i
    50         for (j = 0;j <= k;j++)
    51         {
    52             memcpy(substr, &shortstr[j], i);
    53             substr[i] = '\0';  
    54             if (strstr(longstr, substr) != NULL)             
    55             {
    56                 return substr;
    57             }
    58         }
    59     }
    60 
    61     return NULL;
    62 }
    63 
    64 void main()
    65 {
    66     char *pStr1 = "abcdefghijklmnopqrstuvwxyz";
    67     char *pStr2 = "asdghihgksdkmnohklukjlgsdjk";
    68     cout << commonstr(pStr1, pStr2) << endl; // ghi(第二个公共字符串:mno)
    69     system("pause");
    70 }

    【11】写一个函数在字符串N中查找第一次出现子串M的位置。

    函数实现以及测试程序代码如下:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 // 在字符串n中查找第一次出现子串m的位置
     5 int StrStr(const char *src, const char *sub)
     6 {  
     7     const char *bp;
     8     const char *sp;
     9     int nIndex = -1;
    10     if ((NULL == src)||(NULL == sub))
    11     {
    12         return nIndex;
    13     }
    14 
    15     nIndex = 0;
    16     while (*src)
    17     {
    18         bp = src;
    19         sp = sub;
    20         do
    21         {
    22             if (!*sp)
    23             {
    24                 return nIndex;
    25             }
    26         } while (*bp++ == *sp++);
    27 
    28         ++src;
    29         ++nIndex;
    30     }
    31 
    32     return -1;
    33 }
    34 
    35 void main()
    36 {
    37     char *pStr = "abcdefghijklmn";
    38     char *pDes = "ghi";
    39     char *pSec = "sec";
    40     cout << StrStr(pStr, pDes) << endl;  // 5
    41     cout << StrStr(pStr, pSec) << endl;  // -1
    42     cout << StrStr(pStr, NULL) << endl;  // -1
    43     cout << StrStr(NULL, pSec) << endl;  // -1
    44     system("pause");
    45 }
    46 // run out:
    47 /*
    48 6
    49 -1
    50 -1
    51 -1
    52 请按任意键继续. . .
    53 */

    【12】写一个函数把字符串A中的B字符子串用字符串C进行替换。

    函数实现以及测试程序代码如下:

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 // 在字符串n中查找第一次出现子串m的位置
     6 const char * StrStr(const char *src, const char *sub)
     7 {  
     8     const char *bp;
     9     const char *sp;
    10     int nIndex = -1;
    11     if ((NULL == src)||(NULL == sub))
    12     {
    13         return src;
    14     }
    15 
    16     while (*src)
    17     {
    18         bp = src;
    19         sp = sub;
    20         do
    21         {
    22             if (!*sp)
    23             {
    24                 return src;
    25             }
    26         } while (*bp++ == *sp++);
    27 
    28         ++src;
    29     }
    30 
    31     return NULL;
    32 }
    33 
    34 //把字符串b中的所有字符串a用字符串c进行替换
    35 char* replace(const char *str, const char *sub1, const char *sub2, char *output)
    36 {
    37     char *pOutput = NULL;
    38     const char *pStr = NULL;
    39     int lenSub1 = strlen(sub1);    // 子串sub1的长度
    40     int lenSub2 = strlen(sub2);    // 子串sub2的长度
    41     pOutput = output;
    42     pStr = str; // 用于寻找子串
    43     while (*pStr != 0)
    44     {
    45         pStr = StrStr(pStr, sub1);
    46         if (NULL != pStr)
    47         {
    48             memcpy(pOutput, str, pStr-str); // 复制str的前一部分至pOutput
    49             pOutput += pStr - str;
    50             memcpy(pOutput, sub2, lenSub2);  // 复制sub2子串到output
    51             pOutput += lenSub2;
    52             pStr += lenSub1;   // 为下一次做准备
    53             str = pStr;
    54         }
    55         else
    56         {
    57             break;
    58         }
    59     }
    60     *pOutput = '\0';
    61     if (*str != '\0')
    62     {
    63         strcpy(pOutput, str);
    64     }
    65 
    66     return output;
    67 }
    68 
    69 void  main()
    70 {
    71     char* str = "abcdefghijklabcdefstuvwxyz";
    72     char* str1 = "abcdef";
    73     char* str2 = "fffbb";
    74     char* outPut = (char *)malloc(sizeof(char) * 50);
    75     cout << replace(str, str1, str2, outPut) << endl;
    76     free(outPut);
    77     system("pause");
    78 }
    79 // run out:
    80 /*
    81 fffbbghijklfffbbstuvwxyz
    82 请按任意键继续. . .
    83 */

    【13】待续...

    Good  Good  Study, Day  Day  Up.

    顺序  选择  循环  总结

     

    作者:kaizen
    声明:本文版权归作者和博客园共有,欢迎转载。但未经作者同意必须保留此声明,且在文章明显位置给出本文链接,否则保留追究法律责任的权利。
    签名:顺序 选择 循环
  • 相关阅读:
    了解Boost神器
    官方教程避坑:编译ARM NN/Tensorflow Lite
    信号量 PV 操作
    MAC 读写 ntfs 格式的硬盘
    poj题目分类
    Gelfond 的恒等式
    那些scp里的烂梗
    b
    jmeter集合
    Jmeter文章索引贴
  • 原文地址:https://www.cnblogs.com/Braveliu/p/2840686.html
Copyright © 2011-2022 走看看