12_3.c
上传用户:wyn840322
上传日期:2007-01-13
资源大小:294k
文件大小:4k
源码类别:

数据结构

开发平台:

C/C++

  1. /* ======================================== */
  2. /*    程序实例: 12_3.cpp                    */
  3. /*    字符串类实作                          */
  4. /* ======================================== */
  5. #include <string.h>
  6. #include <iostream.h>
  7. class String                         /* String类声明 */
  8. {
  9. private:
  10.     char str[81];                    /* 成员资料声明   */
  11. public:
  12.     String(char *ch);                /* 构造函数       */
  13.     int length();                    /* 成员函数       */
  14.     void display() { cout << str << 'n'; }
  15.     int pos(String s);
  16.     int pos(char *s);
  17.     String getSubStr(int index, int count);
  18. };
  19. /* ---------------------------------------- */
  20. /*  构造函数: 建立字符串                      */
  21. /* ---------------------------------------- */
  22. String::String(char *s)
  23. {
  24.     if ( strlen(s) > 80 )
  25.        s[80] = 0;                     /* 字符串是否太长   */
  26.     strcpy(str, s);                   /* 复制字符串       */
  27. }
  28. /* ---------------------------------------- */
  29. /*  成员函数: 计算字符串长度                  */
  30. /* ---------------------------------------- */
  31. int String::length()
  32. {
  33.     return strlen(str);               /* 传回字符串长度   */
  34. }
  35. /* ---------------------------------------- */
  36. /*  成员函数: 找寻指定的子字符串              */
  37. /* ---------------------------------------- */
  38. int String::pos(String s)
  39. {
  40.     int found = 0;                    /* 旗标变数       */
  41.     int i = 0;
  42.     
  43.     /* 是否是空字符串, 是否子字符串比字符串长度为长 */
  44.     if ( (str == "") || (s.length() > length()) )
  45.        return -1;
  46.     /* 查找子字符串的主回路 */
  47.     while ( (!found) && ( i < length() ) )
  48.     {
  49.        /* 比较子字符串 */
  50.        if ( strncmp( &str[i], s.str, s.length()) == 0)
  51.           found = 1;                   /* 找到           */
  52.        else ++i;                       /* 下一个字符     */
  53.     }
  54.     if ( found )                       /* 返回找到的位置 */
  55.        return i+1;
  56.     return -1;
  57. }
  58. /* ---------------------------------------- */
  59. /*  成员函数: 查找指定的子字符串              */
  60. /* ---------------------------------------- */
  61. int String::pos(char *s)
  62. {
  63.     String s1(s);                       /* 建立子串对象   */
  64.     return pos(s1);                     /* 呼叫pos()函数  */
  65. }
  66. /* ---------------------------------------- */
  67. /*  成员函数: 取出子字符串                    */
  68. /* ---------------------------------------- */
  69. String String::getSubStr(int index, int count)
  70. {
  71.    String str1("");                     /* 创建临时保存的字符串 */
  72.    int temp;
  73.    /* 参数是否在范围内 */
  74.    if ( (index <= strlen(str)) && (index > 0) && (count > 0) )
  75.    {
  76.       temp = length() - index + 1;      /* 计算子字符串的长度 */
  77.       if ( count > temp )               /* 是否超过字符串结尾 */
  78.          count = temp;                 
  79.       /* 复制子字符串 */
  80.       strncpy(str1.str, &str[index-1], count);
  81.       str1.str[count] = 0;
  82.    }
  83.    return str1;                          /* 返回子字符串       */
  84. }
  85. /* ---------------------------------------- */
  86. /*  主程序: 测试字符串类的成员函数.         */
  87. /* ---------------------------------------- */
  88. void main()
  89. {
  90.     String s1("数据结构是一门重要的课程");/* 创建字符串对象    */
  91.     String s2("This is a book.");
  92.     String s3("is");
  93.     
  94.     cout << "原始中文字符串: ";             /* 输出原始字符串    */
  95.     s1.display();
  96.     cout << "原始英文字符串: ";             /* 输出原始字符串    */
  97.     s2.display();
  98.     /* 显示字符串的长度 */
  99.     cout << "中文字符串共: " << s1.length() << "字符n";
  100.     cout << "英文字符串共: " << s2.length() << "字符n";
  101.     /* 找寻子字符串的位置 */
  102.     cout << "'一门' 子字符串在中文字符串的位置 " << s1.pos("一门") << "n";
  103.     cout << "'is' 子字符串在英文字符串的位置 " << s2.pos(s3) << "n";
  104.     cout << "取出中文字符串15开始共6字符: ";  /* 输出取出的子字符串 */
  105.     /* 取出子字符串 */ 
  106.     s3 = s1.getSubStr(15, 6);
  107.     s3.display();
  108. }