zoukankan      html  css  js  c++  java
  • 简单的字符串操作

    最近学习C语言,回到了几年前了,笨鸟起飞总是慢人一拍,呵呵image

    刚好学习到了指针与字符串,由于对系统自 带的函数不熟悉,所以自己尝试写一些关于操作字符串的函数,当作练习吧,留个笔记.

    头文件ZString.h

    /************************************************************************/
    /* 仿AS3的String工具类                                                  */
    /************************************************************************/
    #ifndef ZSTRING_H_INCLUDED
    #define ZSTRING_H_INCLUDED
         
    /**
    返回由参数 index 指定的位置处的字符。
    参数:
        source 查找的源字符串指针
        index  找查的位置
    返回值:
        查找到的字符,如果查找的位置超出了字符串长度则返回0
    */
    char charAt(const char *source, unsigned int index);
         
    /**
    将指定的字符转换成大写字符,并返回一个大写字符的副本
    参数:
        lowerletter 需要转换的小写字母
    返回值:
        大写字符
    */
    char toUpper(char lowerletter);
         
    /**
    将指定的字符转换成小写字符,并返回一个小写字符的副本
    参数:
        upperletter 需要转换的大写字母
    返回值:
        小写字符
    */
    char toLower(char upperletter);
         
    /**
    将指定的字符串的所有小写字符转成大写
    注意:此函数不会返回字符串的副本,而已直接转换字符串
    参数:
        string 需要转换的字符串指针
    返回值:
        无
    */
    void toUpperCase(char *target, const char *source);
         
    /**
    将指定的字符串的所有大写字符转成小写
    注意:此函数不会返回字符串的副本,而已直接转换字符串
    参数:
        string 需要转换的字符串指针
    返回值:
        无
    */
    void toLowerCase(char *target, const char *source);
         
    /**
    将指定的字符串的首字符转成大写字符
    注意:此函数不会返回字符串的副本,而已直接转换字符串
    参数:
        string 需要转换的字符串指针
    返回值:
        无
    */
    void toUpperCase1(char *target, const char *source);
         
    /**
    将指定的字符串的首字符转成小写字符
    注意:此函数不会返回字符串的副本,而已直接转换字符串
    参数:
        string 需要转换的字符串指针
    返回值:
        无
    */
    void toLowerCase1(char *target, const char *source);
         
         
    /**
     ---未实现---
    截取字符串
    返回一个字符串,其中包含由 startIndex 指定的字符和一直到 endIndex - 1 的所有字符。
    参数:
        target 存放截取后的字符串指针(返回值)
        source 用于被截取的源字符串指针
        startIndex 截取开始的下标
        endIndex 截取结束的下标
    返回值:
        无(target参数)
    */
    void substring(char *target, const char *source, unsigned int startIndex, unsigned int endIndex);
         
    /**
    将 String 对象拆分为一个子字符串数组,方法是在所有出现指定 delimiter 参数的位置进行拆分
    */
    void split(char **target, const char *source, const char *delimiter);
         
    int splitLength(const char *source, const char *delimiter);
         
    #endif // ZSTRING_H_INCLUDED
    

      

    实现部分ZString.c
    #include "ZString.h"
         
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
         
    /************************************************************************/
    /* ZString.h的实现部分                                                                     */
    /************************************************************************/
         
    char charAt(const char *source, unsigned int index){
        char c;
        if(strlen(source) >= index){
            c = *(source + index);
            return c;
        }
        return 0;
    }
         
         
    char toLower(char upperletter){
        char letter = upperletter;
        /*判断是否是大写字母*/
        if(upperletter >= 'A' && upperletter <= 'Z'){
            letter = upperletter - 'A' + 'a';
        }
        return letter;
    }
         
         
    char toUpper(char lowerletter){
        char letter = lowerletter;
        /*判断是否是大写字母*/
        if(lowerletter >= 'a' && lowerletter <= 'z'){
            letter = lowerletter - 'a' + 'A';
        }
        return letter;
    }
         
         
    void toUpperCase(char *target, const char *source){
        char p;
        strcpy_s(target, sizeof(char) + strlen(source) + 1, source);
        while((p = *target)){
            *target = toUpper(p);
            //printf("%c\n",toUpper(p));
            target++;
        }
    }
         
         
    void toLowerCase(char *target, const char *source){
        char p;
        strcpy_s(target, sizeof(char) + strlen(source) + 1, source);
        while((p = *target)){
            *target = toLower(p);
            //printf("%c\n",toUpper(p));
            target++;
        }
    }
         
         
    void toUpperCase1(char *target, const char *source){
        char p;
        strcpy_s(target, sizeof(char) + strlen(source) + 1, source);
        *target = toUpper(*target);
    }
         
         
    void toLowerCase1(char *target, const char *source){
        char p;
        strcpy_s(target, sizeof(char) + strlen(source) + 1, source);
        *target = toLower(*target);
    }
         
    int splitLength(const char *source, const char *delimiter) 
    {
        /*
        经高人指点,变量申请放在开头,或将程序后缀改为cpp,VS才能正常编译
        */
        char *p1 = NULL;
        char *p2 = NULL;
        int num = 0;
        /*临时分配存储source字符串的字符串指针*/
        char *temp = (char *)malloc(strlen(source) + 1);
        /*以下函数已被建议不使用,由strcpy_s代替 */
        /*strcpy(temp, source);*/
        /*将source复制到临时分配的字符串指针temp中*/
        strcpy_s(temp, sizeof(char) * strlen(source) + 1, source);
         
         
        p1 = strstr(temp, delimiter);
        while(p1 != NULL)
        {
            p2 = p1 + 1;
            num++;
            p1 = strstr(p2, delimiter);
        }
        return num;
    }
         
    void split(char **target, const char *source, const char *delimiter)
    {
        /*
        经高人指点,变量申请放在开头,或将程序后缀改为cpp,VS才能正常编译,很操蛋吧^_^
        */
        /*声明一个字符串指定,用于被分隔开的单词的指针*/
        char *s = NULL;
        char *next_token = NULL;
        /*临时分配存储source字符串的字符串指针*/
        char *temp = (char *)malloc(strlen(source) + 1);
         
        /*以下函数已被建议不使用,由strcpy_s代替 */
        /*strcpy(temp, source);*/
        /*将source复制到临时分配的字符串指针temp中*/
        strcpy_s(temp, sizeof(char) * strlen(source) + 1, source);
         
        /*strtok已被建议不使用,由strtok_s代替*/
        s = (char *)strtok_s(temp, delimiter, &next_token);
        while(s != NULL){
            *target++ = s;
            s = (char *)strtok_s(NULL, delimiter, &next_token);
        }
        //*target++ = '\0';
    }
    

      

    main函数的使用:
    #include <stdio.h>
    #include <stdlib.h>
    #include "ZString.h"
       
    int main()
    {
        /*大写转成小写*/
        char s = 'B';
        char s1 = toLower(s);
       
        char ss = 'z';
        char ss1 = toUpper(ss);
       
        char *str = "Dsdf,eDf,s##Dk";
        char *temp = (char *)malloc(strlen(str) + 1);
        char *temp2 = (char *)malloc(strlen(str) + 1);
       
        char *del = ",";
       
        char **arr = (char **)malloc(splitLength(str, del) + 1);
       
        char c = charAt(str, 10);
       
        toLowerCase(temp, str);
        toUpperCase(temp2, str);
       
        split(arr, str, del);
       
        /************************************************************************/
        /* 输出                                                                     */
        /************************************************************************/
        /*输出s转成小写后的字符*/
        printf("Upper letter is %c, convert to lower letter is %c\n", s, s1);
        printf("Lower letter is %c, convert to upper letter is %c\n", ss, ss1);
       
        /*将字符串的所有大写字符转为小写*/
        printf("str = %s\n", str);
        printf("小写temp = %s\n", temp);
        printf("大写temp2 = %s\n", temp2);
       
        printf("array[1] = %s\n", *(arr+1));
       
        printf("c = %c\n", c);
           
       
        system("pause");
        return 0;
    }
    

      

  • 相关阅读:
    001_jdk配置
    mysql(5.7)安装教程
    mysql(5.6)安装教程
    外网发布
    蓝桥 历届试题 分考场
    蓝桥 历届试题 合根植物
    Codeforces Round #650 (Div. 3) D : Task On The Board
    HDU 3336 Count the string
    leetcode [238. 除自身以外数组的乘积]
    leetcode [837. 新21点]
  • 原文地址:https://www.cnblogs.com/imzhstar/p/3077694.html
Copyright © 2011-2022 走看看