简单的字符串操作

最近学习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;
}

  

posted @ 2013-05-14 13:56  A.Kun  阅读(282)  评论(0编辑  收藏  举报