此代码是在Xcode的Single View App 中的main函数中写的,类似于OC的字符串切割函数
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
#define __SYMBOL_VISIBILITY__(type) __attribute__((visibility("hidden"))) type
__SYMBOL_VISIBILITY__(size_t) sys_strlen( const char *_str){
const char *eos = _str;
while(*eos++); /* find `\0` in _str*/
return(eos-_str-1);
}//此函数计算字符串的长度
__SYMBOL_VISIBILITY__(void) *sys_memcpy(void *dst,const void *src,size_t num){
if (dst == NULL || src == NULL) {
return dst;
}
//assert(des>=src+num||src>dst+num);
Byte * psrc = (Byte *)src;//byte 既为unsigned char类型
Byte * pdst = (Byte *)dst;
while(num-- > 0)
*pdst++ = *psrc++;
return dst;
}//替代系统的memcpy
int main(int argc, char * argv[]) {
@autoreleasepool {
char aaa[128]= {"avbv"};
char * bbb = aaa;
//aaa 是一个变量 代表字符串 “avbv”,bbb是aaa的指针,但是代表的是字符串的首个元素的地址,查看输出即可
printf("%s--%p---%p--%c\n",aaa,&aaa,bbb,*bbb);
//输出: avbv--0x16fd4f978---0x16fd4f978--a
for (int i = 0; i<4; i++) {
if (i==2) {
printf("%s--%p---%p--%c\n",aaa,&aaa,bbb,*bbb);
//输出: avbv--0x16fd4f978---0x16fd4f97a--b
*bbb = 0;
printf("%s--%p---%p--%c\n",aaa,&aaa,bbb,*bbb);
//输出: av--0x16fd4f978---0x16fd4f97a—(NULL)
}
bbb++;//每次bbb+1,也就是bbb指向的位置都会向后挪一位
}
//在这个循环中,在这里我们取第三位字符,当执行到i=2时,我们再看输出,我们看输出,会发现aaa变化了avbv—>av
//为什么 在给*bbb=0重新赋值之后,aaa也改变了呢???
//因为字符串的结尾是0,字符串是以0结尾的,原本aaa是avbv,bbb在i=2时指向字符"b”,但是在此处,*bbb=0,将0直接赋值给了bbb指向的位置,那么aaa原本是一个avbv,就改为av0v,字符串以0结尾,那么系统就把aaa变为’av’.
//以上是简单的小例子,看懂上述demo之后,在看下面的
size_t _cl = sys_strlen("羌内恕己以量人兮$惟草木之零落兮:$className$methodName$惟庚寅吾以降$众女嫉余之蛾眉兮”);//获取字符串长度
char clm[256]={0};
char *_clm_ptr = clm;
char *_real_class_name = NULL;
char *_real_m_name = NULL;
int _mynum = 0;
sys_memcpy(clm, "羌内恕己以量人兮$惟草木之零落兮:$className$methodName$惟庚寅吾以降$众女嫉余之蛾眉兮", _cl);//给clm赋值
//在下面的循环中,clm相当于上述demo中的aaa,_clm_ptr相当于demo中的bbb;
//遍历整个字符串,得到每个字符
for(int i=0;i<_cl;i++){
//判断每个字符,当字符是$时,进入下层
if(*_clm_ptr == '$’){
//当指针指向$时,将指针指向的值改为0,那么整个clm,就变化了,(可以手动调试一下)
*_clm_ptr = 0;
_mynum++;
if(_mynum == 2){
printf("_clm_ptr:%p---value:%c\n",_clm_ptr+1,*(_clm_ptr+1));
_real_class_name = _clm_ptr + 1;
//此处也是一大特点,当_mynum=2时,给_real_class_name赋值,_real_class_name也是一个指针,首次运行到这里时,_real_class_name的值是“className$methodName$惟庚寅吾以降$众女嫉余之蛾眉兮”,但是当程序执行到下一个$时,_clm_ptr再次被重新赋值为0,也就是变为了“className0methodName$惟庚寅吾以降$众女嫉余之蛾眉兮”,那么_real_class_name也会变化为“className”(被系统由0切割)
}else if (_mynum == 3){
printf("_clm_ptr:%p---value:%c\n",_clm_ptr+1,*(_clm_ptr+1));
_real_m_name = _clm_ptr +1;
//同上所述,_real_m_name 变为了methodName
}else if (_mynum == 4){
break;
}
}
_clm_ptr++;//每次循环,都会+1,和demo类似,指针向后挪一位
}
printf("_realClass_name:%s---_real_M_name:%s\n",_real_class_name,_real_m_name);
//输出:_real_M_name = className _real_M_name = methodName.
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
网友评论