简单的字符串操作
最近学习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;
}

浙公网安备 33010602011771号