"hi,there."//ok 'hi,there.'//error
"hello,world"//11 " "//1 ""//0
"abc" ≠ "abcd" "abcd" ≠ "abcD" "abcde" = "abcde"
"hello,world" //"h" "hello" " " "" "hello,world" "lover" //"over" "believe" //"lie" "friend" //"end"
    typedef struct
    {
        char data[maxSize];
        int len;
    } String;
      
    #include <stdio.h>
    #include <stdlib.h>
    #define maxSize 20
    #define TRUE 1
    #define FALSE 0
    #define ERROR -1
    
    //串的数据结构
    typedef struct
    {
        char data[maxSize];
        int len;
    } String;
    //串的赋值
    int assign(String *s, char *str)
    {
        int i;
        for (i = 0; *(str + i) != '\0'; i++)
        {
            i++;
        }
        if (i > maxSize)
        {
            return ERROR;
        }
        i = 0;
        while (*(str + i) != '\0')
        {
            s->data[i] = *(str + i);
            i++;
        }
        // MUST
        s->data[i] = '\0';
        s->len = i;
        return TRUE;
    }
    void display(String *s)
    {
        puts(s->data);
    }
    //获取子串
    String *substr(String *s, int i, int len)
    {
        String *str = (String *)malloc(sizeof(String));
        str->len = 0;
        if (i < 0 || i > s->len || len < 0)
        {
            return str;
        }
        // 这个变量可以省略
        int ind, j = 0;
        for ( ind = i; ind < i + len; ind++)
        {
            str->data[j] = s->data[ind];
            j++;
        }
        // MUST
        str->data[j] = '\0';
        str->len = j;
        return str;
    }
    //字符的位置
    int indexOfCh(String *s, char ch)
    {
        if (!s->len)
        {
            return ERROR;
        }
        int ind, i;
        for ( i = 0; i < s->len; i++)
        {
            if (s->data[i] == ch)
            {
                return i;
            }
        }
        return ERROR;
    }
    //串的匹配
    int match(String *s, String *p, int s_start, int p_start, int *s_fail, int *p_fail)
    {
        int i = s_start, j = p_start;
        // 从p串的第一位开始比较
        for (; j < p->len; i++, j++)
        {
            if (s->data[i] != p->data[j])
            {
                *s_fail = i;
                *p_fail = j;
                return FALSE;
            }
        }
        return TRUE;
    }
    //串的位置
    int indexOfStr(String *s, String *p, int pos)
    {
        int s_start = 0, p_start = 0, s_fail, p_fail;
        for (s_start = pos; s_start <= s->len - p->len; s_start++)
        {
            if (match(s, p, s_start, p_start, &s_fail, &p_fail))
            {
                return s_start;
            }
        }
        return ERROR;
    }
    //主函数
    int main(void)
    {
        char *str0 = "hi, there. boy";
        char *str1 = "th";
        int res;
        String *s = (String *)malloc(sizeof(String));
        String *p = (String *)malloc(sizeof(String));
        assign(s, str0);
        assign(p, str1);
        display(s);
        display(p);
        res = indexOfStr(s, p, 0);
        printf("res=%d\n", res); // res=4
        free(s);
        free(p);
        return 0;
    }
      | 赋值 | assign() | 
| 串长 | len() | 
| 清空串 | clear() | 
| 销毁串 | destroy() | 
| 显示串 | display() | 
| 连接串 | concat() | 
| 插入子串 | insertStrAt() | 
| 查找子串 | indexOfStr() | 
| 获取子串 | subStr() | 
| 删除串 | delStr() | 
| 删除指定位置的串 | delStrAt() | 
| 替换串 | replaceStr() | 
| 指定位置插入字符 | insertChAt() | 
| 查找字符 | indexOfCh() | 
| 查找2个字符 | indexOfChs() | 
| 删除字符 | delCh() | 
| 删除指定位置字符 | delChAt() | 
| 修改指定位置字符 | modChAt() | 
| 替换字符 | replaceCh() | 
| 替换指定位置字符 | replaceChAt() | 
    //数据节点:以字符节点为例
    typedef struct Node
    {
        char data;
        struct Node *next;
    } Node;
    //串
    typedef struct
    {
        Node *head;
        int len;
    } String;
      
    #include <stdio.h>
    #include <stdlib.h>
    //串的数据结构
    typedef struct Node
    {
        char data;
        struct Node *next;
    } Node;
    typedef struct
    {
        Node *head;
        int len;
    } String;
    //串的赋值:遍历字符串赋值
    void assign(String *s, char *str)
    {
        Node *p, *pre = s->head;
        int i;
        for (i = 0; *(str + i) != '\0'; i++)
        {
            p = (Node *)malloc(sizeof(Node));
            p->data = *(str + i);
            p->next = pre->next;
            pre->next = p;
            // MUST
            pre = p;
        }
        s->len = i;
    }
    //遍历串
    void display(String *s)
    {
        Node *p = s->head->next;
        while (p)
        {
            printf("%c", p->data);
            p = p->next;
        }
        printf("\n");
    }
    
    //其它函数略
    //主函数
    int main(void)
    {
        String *s = (String *)malloc(sizeof(String));
        s->head = (Node *)malloc(sizeof(Node));
        //以#表示头节点
        s->head->data = '#';
        s->head->next = NULL;
        s->len = 0;
        assign(s, "hi, there.");
        printf("%d\n", s->len);
        display(s);
        free(s);
        return 0;
    }