目录

前言 1.1

概览 1.2

C开发心得 1.3

字符串 1.3.1

内存 1.3.2

文件 1.3.3

open 1.3.3.1

stat 1.3.3.2

realpath 1.3.3.3

bool布尔 1.3.4

int整数 1.3.5

内联汇编 1.3.6

可变参数 1.3.7

修饰符 1.3.8

const常量 1.3.8.1

restrict 1.3.8.2

其他 1.3.9

syscall 1.3.9.1

enum枚举 1.3.9.2

错误码errno 1.3.9.3

正则 1.3.9.4

附录 1.4

参考资料 1.4.1

前言

C语言开发心得

最新版本：v0.6

更新时间：20221030

简介

总结C语言开发期间的各种心得，尤其是常用代码段。包括各种方面：字符串、内存、文件的open、stat、realpath等，bool布尔、int整数、内联汇编、可变参数、修饰符、const常量、restrict，以及其他的syscall、enum枚举、错误码errno、正则等。

源码+浏览+下载

本书的各种源码、在线浏览地址、多种格式文件下载如下：

HonKit源码

crifan/c_lang_dev_summary: C语言开发心得

如何使用此HonKit源码去生成发布为电子书

详见：crifan/honkit_template: demo how to use crifan honkit template and demo

在线浏览

C语言开发心得 book.crifan.org

C语言开发心得 crifan.github.io

离线下载阅读

C语言开发心得 PDF

C语言开发心得 ePub

C语言开发心得 Mobi

版权和用途说明

此电子书教程的全部内容，如无特别说明，均为本人原创。其中部分内容参考自网络，均已备注了出处。如发现有侵权，请通过邮箱联系我 admin 艾特 crifan.com，我会尽快删除。谢谢合作。

各种技术类教程，仅作为学习和研究使用。请勿用于任何非法用途。如有非法用途，均与本人无关。

鸣谢

感谢我的老婆陈雪的包容理解和悉心照料，才使得我crifan有更多精力去专注技术专研和整理归纳出这些电子书和技术教程，特此鸣谢。

更多其他电子书

本人crifan还写了其他150+本电子书教程，感兴趣可移步至：

crifan/crifan_ebook_readme: Crifan的电子书的使用说明

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 23:02:08

概览

概览

此处整理在开发期间，关于C语言方面的心得。尤其是常用代码段。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:20:24

C开发心得

C开发心得

整理C语言开发期间的各种心得。

主要是以常用代码段，常用函数的方式，整理出来。

目前大多数代码都已整理到自己的在线的库中了：

C语言版本的crifanLib

https://github.com/crifan/crifanLib/blob/master/c/crifanLib.c

https://github.com/crifan/crifanLib/blob/master/c/CrifanLib.h

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 23:01:40

字符串

字符串

TODO：

【整理】C语言中字符串操作相关函数

【整理】C语言中字符串拷贝strdup

【已解决】C语言中如何判断字符串是以特定字符串开始startWith

【已解决】C语言中字符串指针加index索引设置字符值但无效

【已解决】C语言中申请空间后再去字符串拷贝

【已解决】C代码报错：Invalid application of sizeof to an incomplete type const char *[]

【已解决】XCode中C代码strlen报错：Implicitly declaring library function strlen with type unsigned long const char

【已解决】C语言中初始化字符串空数组后续添加字符串或者字符串依次相加

【已解决】C语言中如何合并2个静态const的字符串列表

【记录】别人自定义strstr字符串检测失败导致越狱检测误判

计算字符串数组个数

【已解决】C语言中如何判断字符串数组列表的个数

判断相等

【已解决】C语言中判断2个字符串是否相等

格式化

【已解决】C中如何非打印输出的格式化字符串

去除最开始和最后一个字符

【已解决】C语言中如何去除字符串的最开始和最后一个字符

判断字符串是否以特定字符结尾

TODO：

【已解决】C语言中判断字符串是否以特定字符结尾

// "/Library/dpkg/", "/" -> true
bool strEndsWith(const char* fullStr, const char* endStr)
{
    if (!fullStr || !endStr){
        return false;
    }

    size_t fullStrLen = strlen(fullStr);
    size_t endStrLen = strlen(endStr);

    if (endStrLen >  fullStrLen){
        return false;
    }

//    return strncmp(fullStr + fullStrLen - endStrLen, endStr, endStrLen) == 0;
    const char* partStr = fullStr + (fullStrLen - endStrLen);
    bool isEndEqual = (0 == strcmp(partStr, endStr));
    return isEndEqual;
}

NULL terminated string

字符串都是0结尾的，叫做：NULL terminated string

其实：

\0 == NULL

\0的字符，对应写成：'\0'

举例：

（1）关于普通的一个字符串：

char* name = “Crifan”;

其内部存储的是：

C r i f a n 0

即

C r i f a n \0

TODO：

把上面的字符串存储，用表格画出来

可以考虑用之前别人介绍的：

【记录】在线绘图画表格图等：GraphvizOnline

（2）判断字符串的某个字符，是否是NULL，一般可以写成：

curChar == '\0'

或：

curChar == NULL

比如：

// "CYDIA://xxx" -> "cydia://xxx"
char* strToLowercase(const char* origStr){
    char* lowerStr = strdup(origStr);
    char curChar = lowerStr[0];
    for(int i = 0; curChar != '\0'; i++){
        curChar = lowerStr[i];
        char curCharLower = tolower(curChar);
        lowerStr[i] = curCharLower;
    }
    return lowerStr;
}

就是：

curChar != '\0'

去比较：当前字符是否是\0

== 判断当前字符串是否结束

（3）对应的，把字符串中某个位置直接设置为NULL = ‘\0’，就可以起到：

截断字符串

结束字符串

等效果

比如之前的函数：

// file mode to string
void fileModeToStr(mode_t mode, char * modeStrBuf) {
    // buf must have at least 10 bytes
    const char chars[] = "rwxrwxrwx";
    for (size_t i = 0; i < 9; i++) {
//        buf[i] = (mode & (1 << (8-i))) ? chars[i] : '-';
        bool hasSetCurBit = mode & (1 << (8-i));
        modeStrBuf[i] = hasSetCurBit ? chars[i] : '-';
    }
    modeStrBuf[9] = '\0';
}

最后就是：

    modeStrBuf[9] = '\0';

去结束字符串的

以及：

// "/./Library/../Library/dpkg/.", "/." -> "/./Library/../Library/dpkg"
char* removeTail(const char* fullStr, const char* tailStr){
    char *newStr = strdup(fullStr);

    size_t fullLen = strlen(fullStr);
    size_t tailLen = strlen(tailStr);

    if (tailLen > fullLen){
        return newStr;
    }

    if (strEndsWith(fullStr, tailStr)){
        size_t endIdx = fullLen - tailLen;
        newStr[endIdx] = '\0';
    }

    return newStr;
}

中的：

newStr[endIdx] = '\0';

去把最后部分的某个位置的字符，设置为\0，从而起到截断字符串的效果。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:57:23

内存

内存

TODO：

内存操作：mem相关函数

memcpy等

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:35:32

文件

文件

TODO：

【已解决】C语言中实现类似于python的os.path.join的path路径合并

路径path处理

【已解决】C语言中处理路径去掉当前目录的.点和上级目录的..两个点

【已解决】用纯C语言实现解析路径支持点当前目录和点点上级目录

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:51:46

open

open

TODO：

open

【整理】C语言中open打开文件函数定义和参数含义解释

【已解决】iOS越狱检测：iOS的app中用open打开文件

open vs fopen

【已解决】C语言中open和fopen的区别

【未解决】iOS中fopen打开文件返回NULL

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:49:21

stat

stat

TODO：

【已解决】iOS其他版本stat有哪些：lstat、fstat、stat64等

【已解决】Linux中struct stat中mode_t的定义

【已解决】C中如何打印输出stat中mode_t类型的st_mode值

【已解决】iOS中stat返回值struct stat的stat_info解析：新增st_size文件大小解析

【已解决】iOS中ObjC中如何打印输出C中的结构体变量struct stat

【已解决】iOS中st_size的off_t是什么类型

【已解决】iOS的app中用stat打开超过2G的大文件

【无需解决】iOS中stat64报错：Variable has incomplete type struct stat64

【已解决】Linux中stat函数的原始定义

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:51:35

realpath

realpath

TODO：

【已解决】C中realpath对于部分存在的路径却解析失败

【已解决】C语言中用realpath去除路径中的当前路径的.点和上级路径的..两个点

【已解决】C语言中处理路径去掉当前目录的.点和上级目录的..两个点

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:49:27

bool布尔

bool布尔

TODO：

【已解决】XCode中iOS的C代码报错：Use of undeclared identifier bool

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:50:19

int整数

int整数

TODO：

【已解决】C语言中int数组指针的指针无法获取int值

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:50:40

内联汇编

内联汇编

TODO：

【整理Book】asm汇编开发心得

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:36:54

可变参数

可变参数

TODO：

【已解决】C语言自定义可变参数字符串函数va_arg没有正确结束

【已解决】C语言中如何获取到带三个点的函数中的可变参数

【整理】C语言中的可变参数函数

【已解决】C语言中解析获取计算出syscall函数可变参数的参数个数

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:48:54

修饰符

修饰符

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:44:42

const常量

const常量

TODO：

【已解决】C语言中定义静态的字符串数组

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:44:56

restrict

restrict

TODO：

【已解决】C语言中restrict限定符描述符的含义

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:41:46

其他

其他

TODO：

【已解决】C语言中如何把.c中变量的声明放到.h中供别人调用

【已解决】已越狱iPhone的iOS中如何命令行创建一个大文件

【已解决】Linux中ls以list列表方式输出时信息的格式和含义

【已解决】Linux中find命令如何模糊匹配查找部分文件名

【已解决】iOS或Linux或C中pid_t的定义

【已解决】iOS中C语言优化log日志宏定义

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:51:20

syscall

syscall

TODO：

syscall 系统调用相关

其他

【整理】syscall内核系统调用和svc 0x80相关基础知识

【无需解决】iOS反越狱检测之如何绕过hook：汇编asm调用syscall

具体不同函数

open

【已解决】iOS反越狱检测之：syscall函数的open

iOS中

【记录】iOS中xnu源码中关于svc 0x80的syscall的具体实现

【整理】iOS中syscall的系统调用编号number的定义

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:37:19

enum枚举

enum枚举

TODO：

【已解决】C语言或iOS的ObjC中实现enum枚举

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:40:28

错误码errno

错误码errno

TODO：

【已解决】iOS的C语言中如何判断realpath函数报错时Operation not permitted对应的errno值

【已解决】C中调用realpath出错时如何获取到具体错误原因errno

【未解决】C语言中如何设置errno

【无法解决】iOS中open打开文件失败但errno没返回具体错误原因

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:59:15

正则

正则

TODO：

【未解决】C语言中用正则处理字符串替换

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:40:57

附录

附录

下面列出相关参考资料。

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:21:20

参考资料

参考资料

另类iOS上的C函数hook - 简书 (jianshu.com)

crifan.org，使用署名4.0国际(CC BY 4.0)协议发布 all right reserved，powered by Gitbook最后更新： 2022-10-30 22:53:19