c语言封装OC用的字符串

这个也主要给自己看的,记录一下语法用的,当然也可以参考
文件String.h

#ifndef String_h
#define String_h

#include <stdio.h>

typedef struct{
    long length;
    char *strArr;
}String;

String *allocAndInit(void);
String *initWithString(const String *str);
long length(const String *str);
String *upper(String *str);
String *lower(String *str);
String *appendString(String *des,const String *src);
char charAt(long index,const String *str);
void freeString(String *str);
String *subString(const String *str,long index,long length);
int containsString(const String *str1,const String *partten);
int isEqual(const String *str1,const String *str2);

#endif /* String_h */

文件String.c

#include "String.h"
#include <stdlib.h>
#include <string.h>
#include <assert.h>

String *allocAndInit(void){
    String *str = (String *)malloc(sizeof(String));
    memset(str, 0, sizeof(String));
    char *arr = (char *)malloc(sizeof(char));
    arr[0] = '\0';
    str->strArr = arr;
    return str;
}
String *initWithString(const String *str){
    if (str == NULL) return NULL;
    String *newStr = allocAndInit();
    newStr->length = str->length;
    char *arr = (char *)malloc(str->length+1);
    strcpy(arr, str->strArr);
    newStr->strArr = arr;
    return newStr;
}
long length(const String *str){
    if (str == NULL) return 0;
    return str->length;
}
String *upper(String *str){
    if (str == NULL) return str;
    char *tmp = str->strArr;
    for (int i = 0; i < str->length; i++) {
        if (tmp[i] < 'a' || tmp[i] > 'z') continue;
        tmp[i] += 32;
    }
    return str;
}
String *lower(String *str){
    if (str == NULL) return str;
    char *tmp = str->strArr;
    for (int i = 0; i < str->length; i++) {
        if (tmp[i] < 'A' || tmp[i] > 'Z') continue;
        tmp[i] -= 32;
    }
    return str;
}
String *appendString(String *des,const String *src){
    if (src == NULL || src->length <= 0) return des;
    long len = des->length+src->length+1;
    char *tmp = malloc(sizeof(char)*len);
    strcpy(tmp, des->strArr);
    strcat(tmp, src->strArr);
    free(des->strArr);
    des->length = len-1;
    des->strArr = tmp;
    return des;
}
char charAt(long index,const String *str){
    assert(index > 0 || index < str->length);
    if (str->strArr == NULL) return '\0';
    char *arr = str->strArr;
    return arr[index];
}
void freeString(String *str){
    if (str == NULL) return;
    if (str->strArr == NULL) return;
    free(str->strArr);
    free(str);
    str = NULL;
}
String *subString(const String *str,long index,long length){
    if (str == NULL) return NULL;
    assert(index > 0 || index < str->length);
    if (index + length > str->length) {
        length = str->length - index;
    }
    String *subStr = allocAndInit();
    subStr->length = length;
    subStr->strArr = (char *)malloc(sizeof(char)*(length+1));
    for (long i = 0,j = index; i < length; i++,j++) {
        (subStr->strArr)[i] = (str->strArr)[j];
    }
    return subStr;
}

//这部分算法写的好蠢,凑合着看吧(可能会有问题😄)
int containsString(const String *str1,const String *partten){
    if (str1 == NULL || partten == NULL) return 0;
    if (partten->length > str1->length) return 0;
    for (int i = 0; i < str1->length; i++) {
        for (int j = 0; j < partten->length; j++) {
            if (i+j>=str1->length) return 0;
            int res1 = (partten->strArr)[j] == (str1->strArr)[i+j];
            if(res1 == 0) break;
            int res2 = j == partten->length-1;
            if(res1 == res2) return 1;
        }
    }
    return 0;
}
int isEqual(const String *str1,const String *str2){
    if(str1 == NULL && str2 == NULL) return 1;
    if (str1->length != str2->length) return 0;
    int res = strcmp(str1->strArr, str2->strArr);
    return res;
}

对接OC的类
GYJString.h

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface GYJString : NSObject

- (instancetype)init;
- (instancetype)initWithString:(GYJString *)string;
- (NSInteger)length;
- (void)upper;
- (void)lower;
- (void)appendString:(GYJString *)string;
- (char)charAt:(NSInteger)index;
- (GYJString *)subString:(NSInteger)index length:(NSInteger)length;
- (BOOL)containsString:(GYJString *)string;
- (BOOL)isEqual:(GYJString *)string;
- (GYJString *)copy;
- (GYJString *)mutableCopy;
@end
NS_ASSUME_NONNULL_END

.m实现

#import "GYJString.h"
#import "String.h"

@interface GYJString ()
{
    String *_str;
}
@end

@implementation GYJString

- (instancetype)init{
    
    if (self = [super init]) {
        _str = allocAndInit();
    }
    return self;
    
}
- (instancetype)initWithString:(GYJString *)string{
    if (self = [super init]) {
        _str = initWithString(string->_str);
    }
    return self;
}
- (instancetype)initWithCString:(String *)str{
    if (self = [super init]) {
        _str = initWithString(str);
    }
    return self;
}
- (NSInteger)length{
 
    return length(_str);
}
- (void)upper{
    upper(_str);
}
- (void)lower{
    lower(_str);
}
- (void)appendString:(GYJString *)string{
    appendString(self->_str, string->_str);
}
- (char)charAt:(NSInteger)index{
    return charAt(index, _str);
}
- (GYJString *)subString:(NSInteger)index length:(NSInteger)length{
    String *tmp = subString(_str, index, length);
    return [[GYJString alloc]initWithCString:tmp];
}
- (BOOL)containsString:(GYJString *)string{
    return (BOOL)containsString(self->_str,string->_str);
}
- (BOOL)isEqual:(GYJString *)string{
    return (BOOL)isEqual(self->_str, string->_str);
}
- (GYJString *)copy{
    GYJString *p = self;
    return p;
}
- (GYJString *)mutableCopy{
    GYJString *tmp = [[GYJString alloc]initWithString:self];
    return tmp;
}
- (void)dealloc{
    deleteString(_str);
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容