美文网首页
c语言封装OC用的字符串

c语言封装OC用的字符串

作者: ZZ_军哥 | 来源:发表于2022-09-13 15:33 被阅读0次

这个也主要给自己看的,记录一下语法用的,当然也可以参考
文件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

相关文章

  • runtime的基本使用

    OC语言是基于C语言进行封装的一种面向对象的语言,因此OC的底层就是C,runtime则是用来链接OC与C,用C语...

  • c语言封装OC用的字符串

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

  • 从数组中取出n个元素的所有组合(递归实现)

    从小到大排序 1.用OC外层封装的方法 2.用C语言和OC混编实现的方法,直接把结果返回 3.纯C语言实现 从大到...

  • 笔记01 OC 基础

    OC 是对C 语言面向对象的再封装,在实际的编译流程是这样的 oc -> c\c++ -> 汇编 -> 机器语言...

  • runtime —— objc.h

    runtime 一个c语言库,OC是C语言的超级,封装,即OC运行时会全部转化为C语言,即runtime的函数库。...

  • iOS-tips

    OC语言的面向对象特性是通过封装c和c++实现的,编译器会将OC编译为c和c++,再讲c编译为汇编语言,最终转成机...

  • Runtime源码编译

    Objective-C是基于c语言的封装,使C语言具有了面向对象的能力.OC的本质最终还是转换c语言来执行,而这个...

  • Object-C转C++代码命令

    一、我们都知道OC语言是C语言的超集,是对C语言封装,使得拥有面向对象的特性。二、有时候开发中需要查看OC代码的底...

  • runtime01-消息机制

    OC及其动态性 Objective-C是基于C封装的一门面向对象的语言,底层实现是通过C/C++代码实现的。OC语...

  • 面试总结

    OC的理解与特性 . OC是一门面向对象的语言,三大特性:封装 继承 多态。静态语言特性(C++),动态语言的效率...

网友评论

      本文标题:c语言封装OC用的字符串

      本文链接:https://www.haomeiwen.com/subject/atrhortx.html