最近学习C语言,回到了几年前了,笨鸟起飞总是慢人一拍,呵呵。
刚好学习到了指针与字符串,由于对系统自 带的函数不熟悉,所以自己尝试写一些关于操作字符串的函数,当作练习吧,留个笔记.
头文件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; }