0

0

C语言中如何操作SQLite数据库 C语言数据库接口使用指南

下次还敢

下次还敢

发布时间:2025-07-11 11:52:02

|

495人浏览过

|

来源于php中文网

原创

如何在c语言中操作sqlite数据库?1. 包含头文件sqlite3.h;2. 使用sqlite3_open()打开或创建数据库;3. 使用sqlite3_exec()执行sql语句并处理结果集;4. 查询时通过回调函数处理数据;5. 最后用sqlite3_close()关闭连接。如何避免内存泄漏?1. sqlite3_open()和sqlite3_close()配对使用;2. sqlite3_exec()失败时用sqlite3_free()释放错误信息;3. 回调函数中不要直接释放sqlite提供的指针,需拷贝后自行释放;4. 使用预编译语句时务必调用sqlite3_finalize();5. 利用valgrind检测内存泄漏。如何解决中文乱码?1. 确保sqlite使用utf-8编码;2. c程序源文件保存为utf-8;3. 编译器指定-finput-charset=utf-8;4. 字符串常量加u8前缀;5. 使用支持utf-8的输入输出函数如wprintf/wscanf配合setlocale;6. 与sqlite交互的字符串必须为utf-8,必要时用iconv转换编码。如何保证事务原子性?1. 使用begin transaction开始事务;2. 执行数据库操作;3. 成功则commit transaction提交;4. 失败则rollback transaction回滚;5. 每步操作进行错误处理并确保资源释放。如何实现crud应用?1. 创建数据库和表;2. 实现create函数插入数据;3. read函数读取数据并用回调处理结果;4. update函数更新记录;5. delete函数删除记录;6. 主函数调用各功能完成流程,并注意防止sql注入和加强错误处理。

C语言中如何操作SQLite数据库 C语言数据库接口使用指南

C语言操作SQLite数据库,核心在于通过SQLite提供的API,建立连接、执行SQL语句、处理结果集。简单来说,就是用C代码“指挥”SQLite干活。

C语言中如何操作SQLite数据库 C语言数据库接口使用指南

解决方案

首先,需要包含SQLite的头文件sqlite3.h,然后利用sqlite3_open()函数打开或创建一个数据库文件。接下来,用sqlite3_exec()执行SQL语句,例如创建表、插入数据、查询数据等。查询结果需要通过回调函数来处理,这部分稍微复杂一些。最后,记得用sqlite3_close()关闭数据库连接,释放资源。

C语言中如何操作SQLite数据库 C语言数据库接口使用指南

如何避免C语言操作SQLite时的内存泄漏?

内存泄漏是C语言编程中常见的问题,在操作SQLite时也不例外。要避免内存泄漏,关键在于正确管理SQLite API返回的内存。

立即学习C语言免费学习笔记(深入)”;

  1. sqlite3_open()sqlite3_close()配对使用: 确保每次调用sqlite3_open()打开数据库后,最终都要调用sqlite3_close()关闭连接。否则,数据库连接占用的资源将无法释放。

    C语言中如何操作SQLite数据库 C语言数据库接口使用指南
  2. sqlite3_exec()中的错误处理: 如果sqlite3_exec()执行失败,它可能会返回一个错误信息字符串。这个字符串是由SQLite分配的内存,需要用sqlite3_free()释放。检查sqlite3_exec()的返回值,如果不是SQLITE_OK,则调用sqlite3_errmsg()获取错误信息,并在使用完毕后释放它。

    char *errMsg = 0;
    int rc = sqlite3_exec(db, sql, callback, 0, &errMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", errMsg);
        sqlite3_free(errMsg); // 释放错误信息
    }
  3. 回调函数中的数据拷贝:sqlite3_exec()的回调函数中,SQLite会将查询结果作为参数传递给回调函数。这些数据通常是指向SQLite内部数据结构的指针。不要尝试直接释放这些指针指向的内存,因为它们不是由你的程序分配的。如果需要在回调函数之外使用这些数据,应该将它们拷贝到你自己的内存空间中,并在使用完毕后释放你拷贝的内存。

  4. 预编译语句(sqlite3_prepare_v2()): 如果需要多次执行相同的SQL语句,建议使用预编译语句。sqlite3_prepare_v2()函数用于编译SQL语句,sqlite3_step()用于执行语句,sqlite3_reset()用于重置语句以便再次执行,sqlite3_finalize()用于释放预编译语句占用的资源。务必确保在不再需要预编译语句时调用sqlite3_finalize()

    sqlite3_stmt *stmt;
    const char *sql = "SELECT * FROM mytable WHERE id = ?";
    int rc = sqlite3_prepare_v2(db, sql, -1, &stmt, 0);
    if (rc == SQLITE_OK) {
        sqlite3_bind_int(stmt, 1, id); // 绑定参数
        while ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {
            // 处理结果
        }
        sqlite3_finalize(stmt); // 释放预编译语句
    }
  5. 使用Valgrind等工具进行检测: Valgrind是一个强大的内存调试工具,可以帮助你检测C程序中的内存泄漏。在开发过程中,定期使用Valgrind等工具进行检测,可以及早发现并修复内存泄漏问题。

总之,避免C语言操作SQLite时的内存泄漏,需要养成良好的编程习惯,仔细检查代码,确保所有分配的内存都得到释放。

如何处理C语言操作SQLite时的中文乱码问题?

中文乱码通常是由于字符编码不一致导致的。SQLite默认使用UTF-8编码,而C语言程序可能使用其他编码(例如GBK)。要解决中文乱码问题,需要确保数据在写入和读取SQLite数据库时都使用相同的编码,并且C语言程序能够正确处理UTF-8编码的字符串。

  1. 设置SQLite的编码方式: 虽然SQLite默认使用UTF-8,但可以通过编译选项来修改。如果你的SQLite库不是用UTF-8编译的,需要重新编译。不过,通常情况下,我们不需要手动设置SQLite的编码方式,保持默认的UTF-8即可。

  2. C语言程序使用UTF-8编码: 确保你的C语言程序使用UTF-8编码来处理字符串。这涉及到以下几个方面:

    • 源代码文件编码: 将C语言源代码文件保存为UTF-8编码。在Linux系统中,可以使用iconv命令转换文件编码。在Windows系统中,可以在文本编辑器中选择UTF-8编码保存文件。
    • 编译器选项: 有些编译器需要指定源文件的编码方式。例如,在使用GCC编译器时,可以使用-finput-charset=UTF-8选项指定源文件编码。
    • 字符串常量: 在C语言中,字符串常量默认使用编译器使用的编码方式。如果编译器没有指定编码方式,可能会使用操作系统的默认编码方式。为了确保字符串常量使用UTF-8编码,可以使用u8前缀。例如,u8"你好"表示一个UTF-8编码的字符串常量。
  3. 使用UTF-8编码的输入/输出函数: 标准C库提供的输入/输出函数(例如printfscanf)通常使用操作系统的默认编码方式。为了正确处理UTF-8编码的字符串,可以使用一些支持UTF-8编码的输入/输出函数。例如,在Linux系统中,可以使用wprintfwscanf函数,配合setlocale(LC_ALL, "")设置locale。

    #include 
    #include 
    #include 
    
    int main() {
        setlocale(LC_ALL, ""); // 设置locale
        wchar_t str[] = L"你好,世界!";
        wprintf(L"%ls\n", str);
        return 0;
    }

    需要注意的是,wchar_t类型的大小和编码方式在不同的平台可能不同。在Windows系统中,wchar_t通常使用UTF-16编码,而在Linux系统中,wchar_t通常使用UTF-32编码。

  4. 在SQLite API中使用UTF-8编码: SQLite API中的字符串参数(例如SQL语句、表名、列名)都应该使用UTF-8编码。如果你的程序中使用的是其他编码方式的字符串,需要先将其转换为UTF-8编码,然后再传递给SQLite API。可以使用iconv函数进行编码转换。

    PHP高级开发技巧与范例
    PHP高级开发技巧与范例

    PHP是一种功能强大的网络程序设计语言,而且易学易用,移植性和可扩展性也都非常优秀,本书将为读者详细介绍PHP编程。 全书分为预备篇、开始篇和加速篇三大部分,共9章。预备篇主要介绍一些学习PHP语言的预备知识以及PHP运行平台的架设;开始篇则较为详细地向读者介绍PKP语言的基本语法和常用函数,以及用PHP如何对MySQL数据库进行操作;加速篇则通过对典型实例的介绍来使读者全面掌握PHP。 本书

    下载
    #include 
    #include 
    #include 
    
    // 将字符串从一种编码转换为另一种编码
    char *convert_encoding(const char *src, const char *from_charset, const char *to_charset) {
        iconv_t cd = iconv_open(to_charset, from_charset);
        if (cd == (iconv_t)-1) {
            perror("iconv_open");
            return NULL;
        }
    
        size_t src_len = strlen(src);
        size_t dest_len = 2 * src_len; // 预留足够的空间
        char *dest = (char *)malloc(dest_len);
        if (dest == NULL) {
            perror("malloc");
            iconv_close(cd);
            return NULL;
        }
        memset(dest, 0, dest_len);
    
        char *src_ptr = (char *)src;
        char *dest_ptr = dest;
        size_t res = iconv(cd, &src_ptr, &src_len, &dest_ptr, &dest_len);
        if (res == (size_t)-1) {
            perror("iconv");
            free(dest);
            iconv_close(cd);
            return NULL;
        }
    
        iconv_close(cd);
        return dest;
    }
    
    // 示例:将GBK编码的字符串转换为UTF-8编码
    char *gbk_str = "你好,世界!";
    char *utf8_str = convert_encoding(gbk_str, "GBK", "UTF-8");
    if (utf8_str != NULL) {
        // 使用utf8_str
        free(utf8_str);
    }

总之,要解决C语言操作SQLite时的中文乱码问题,需要确保数据在写入和读取SQLite数据库时都使用UTF-8编码,并且C语言程序能够正确处理UTF-8编码的字符串。这涉及到源代码文件编码、编译器选项、字符串常量、输入/输出函数以及SQLite API的使用等多个方面。

如何在C语言中使用事务来保证SQLite数据库操作的原子性?

事务是保证数据库操作原子性、一致性、隔离性和持久性(ACID)的关键机制。在C语言中使用SQLite事务,可以确保一系列数据库操作要么全部成功执行,要么全部回滚,从而避免数据不一致的情况。

  1. 开始事务: 使用BEGIN TRANSACTION语句开始一个事务。这会告诉SQLite开始记录对数据库的更改,但不会立即将这些更改写入磁盘。

    int rc = sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &errMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Failed to begin transaction: %s\n", errMsg);
        sqlite3_free(errMsg);
        // 处理错误
    }
  2. 执行数据库操作: 在事务中执行一系列的数据库操作,例如插入、更新或删除数据。

    // 示例:插入两条数据
    char *sql1 = "INSERT INTO mytable (name, value) VALUES ('Alice', 10);";
    char *sql2 = "INSERT INTO mytable (name, value) VALUES ('Bob', 20);";
    
    rc = sqlite3_exec(db, sql1, NULL, NULL, &errMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", errMsg);
        sqlite3_free(errMsg);
        // 处理错误
    }
    
    rc = sqlite3_exec(db, sql2, NULL, NULL, &errMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", errMsg);
        sqlite3_free(errMsg);
        // 处理错误
    }
  3. 提交事务或回滚事务: 如果所有数据库操作都成功执行,则使用COMMIT TRANSACTION语句提交事务,将所有更改写入磁盘。如果任何一个数据库操作失败,则使用ROLLBACK TRANSACTION语句回滚事务,撤销所有更改。

    // 提交事务
    rc = sqlite3_exec(db, "COMMIT TRANSACTION", NULL, NULL, &errMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Failed to commit transaction: %s\n", errMsg);
        sqlite3_free(errMsg);
        // 处理错误
    }
    
    // 或者,回滚事务
    rc = sqlite3_exec(db, "ROLLBACK TRANSACTION", NULL, NULL, &errMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Failed to rollback transaction: %s\n", errMsg);
        sqlite3_free(errMsg);
        // 处理错误
    }
  4. 错误处理: 在事务处理过程中,务必进行错误处理。如果任何一个数据库操作失败,都需要回滚事务,并进行适当的错误处理。

    int rc;
    char *errMsg = 0;
    
    rc = sqlite3_exec(db, "BEGIN TRANSACTION", NULL, NULL, &errMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Failed to begin transaction: %s\n", errMsg);
        sqlite3_free(errMsg);
        goto rollback;
    }
    
    // 执行数据库操作
    rc = sqlite3_exec(db, "INSERT INTO mytable (name, value) VALUES ('Alice', 10);", NULL, NULL, &errMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", errMsg);
        sqlite3_free(errMsg);
        goto rollback;
    }
    
    rc = sqlite3_exec(db, "INSERT INTO mytable (name, value) VALUES ('Bob', 20);", NULL, NULL, &errMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", errMsg);
        sqlite3_free(errMsg);
        goto rollback;
    }
    
    // 提交事务
    rc = sqlite3_exec(db, "COMMIT TRANSACTION", NULL, NULL, &errMsg);
    if (rc != SQLITE_OK) {
        fprintf(stderr, "Failed to commit transaction: %s\n", errMsg);
        sqlite3_free(errMsg);
        goto rollback;
    }
    
    // 清理资源
    sqlite3_close(db);
    return 0;
    
    rollback:
    sqlite3_exec(db, "ROLLBACK TRANSACTION", NULL, NULL, &errMsg);
    if (errMsg) {
        fprintf(stderr, "Failed to rollback transaction: %s\n", errMsg);
        sqlite3_free(errMsg);
    }
    sqlite3_close(db);
    return 1;
  5. 使用预编译语句: 如果需要在事务中多次执行相同的SQL语句,建议使用预编译语句,可以提高性能。

总之,在C语言中使用事务来保证SQLite数据库操作的原子性,需要使用BEGIN TRANSACTIONCOMMIT TRANSACTIONROLLBACK TRANSACTION语句,并进行适当的错误处理。

如何使用C语言和SQLite实现一个简单的CRUD应用?

CRUD(Create, Read, Update, Delete)是数据库应用中最基本的操作。下面是一个使用C语言和SQLite实现简单CRUD应用的示例。

  1. 创建数据库和表: 首先,创建一个SQLite数据库,并在其中创建一个表。

    #include 
    #include 
    #include 
    
    int create_database(const char *db_file) {
        sqlite3 *db;
        char *errMsg = 0;
        int rc = sqlite3_open(db_file, &db);
    
        if (rc) {
            fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
            sqlite3_close(db);
            return 1;
        }
    
        const char *sql = "CREATE TABLE IF NOT EXISTS contacts ("
                          "id INTEGER PRIMARY KEY AUTOINCREMENT,"
                          "name TEXT NOT NULL,"
                          "email TEXT,"
                          "phone TEXT"
                          ");";
    
        rc = sqlite3_exec(db, sql, 0, 0, &errMsg);
    
        if (rc != SQLITE_OK) {
            fprintf(stderr, "SQL error: %s\n", errMsg);
            sqlite3_free(errMsg);
            sqlite3_close(db);
            return 1;
        }
    
        sqlite3_close(db);
        printf("Database and table created successfully.\n");
        return 0;
    }
  2. 创建(Create): 实现一个函数,用于向数据库中插入新的联系人信息。

    int create_contact(const char *db_file, const char *name, const char *email, const char *phone) {
        sqlite3 *db;
        char *errMsg = 0;
        int rc = sqlite3_open(db_file, &db);
    
        if (rc) {
            fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
            sqlite3_close(db);
            return 1;
        }
    
        char sql[256];
        snprintf(sql, sizeof(sql), "INSERT INTO contacts (name, email, phone) VALUES ('%s', '%s', '%s');", name, email, phone);
    
        rc = sqlite3_exec(db, sql, 0, 0, &errMsg);
    
        if (rc != SQLITE_OK) {
            fprintf(stderr, "SQL error: %s\n", errMsg);
            sqlite3_free(errMsg);
            sqlite3_close(db);
            return 1;
        }
    
        sqlite3_close(db);
        printf("Contact created successfully.\n");
        return 0;
    }
  3. 读取(Read): 实现一个函数,用于从数据库中读取联系人信息。

    int read_contacts(const char *db_file) {
        sqlite3 *db;
        char *errMsg = 0;
        int rc = sqlite3_open(db_file, &db);
    
        if (rc) {
            fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
            sqlite3_close(db);
            return 1;
        }
    
        const char *sql = "SELECT * FROM contacts;";
    
        // 回调函数,用于处理查询结果
        static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
            int i;
            for (i = 0; i < argc; i++) {
                printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
            }
            printf("\n");
            return 0;
        }
    
        rc = sqlite3_exec(db, sql, callback, 0, &errMsg);
    
        if (rc != SQLITE_OK) {
            fprintf(stderr, "SQL error: %s\n", errMsg);
            sqlite3_free(errMsg);
            sqlite3_close(db);
            return 1;
        }
    
        sqlite3_close(db);
        return 0;
    }
  4. 更新(Update): 实现一个函数,用于更新数据库中的联系人信息。

    int update_contact(const char *db_file, int id, const char *name, const char *email, const char *phone) {
        sqlite3 *db;
        char *errMsg = 0;
        int rc = sqlite3_open(db_file, &db);
    
        if (rc) {
            fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
            sqlite3_close(db);
            return 1;
        }
    
        char sql[256];
        snprintf(sql, sizeof(sql), "UPDATE contacts SET name = '%s', email = '%s', phone = '%s' WHERE id = %d;", name, email, phone, id);
    
        rc = sqlite3_exec(db, sql, 0, 0, &errMsg);
    
        if (rc != SQLITE_OK) {
            fprintf(stderr, "SQL error: %s\n", errMsg);
            sqlite3_free(errMsg);
            sqlite3_close(db);
            return 1;
        }
    
        sqlite3_close(db);
        printf("Contact updated successfully.\n");
        return 0;
    }
  5. 删除(Delete): 实现一个函数,用于从数据库中删除联系人信息。

    int delete_contact(const char *db_file, int id) {
        sqlite3 *db;
        char *errMsg = 0;
        int rc = sqlite3_open(db_file, &db);
    
        if (rc) {
            fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
            sqlite3_close(db);
            return 1;
        }
    
        char sql[256];
        snprintf(sql, sizeof(sql), "DELETE FROM contacts WHERE id = %d;", id);
    
        rc = sqlite3_exec(db, sql, 0, 0, &errMsg);
    
        if (rc != SQLITE_OK) {
            fprintf(stderr, "SQL error: %s\n", errMsg);
            sqlite3_free(errMsg);
            sqlite3_close(db);
            return 1;
        }
    
        sqlite3_close(db);
        printf("Contact deleted successfully.\n");
        return 0;
    }
  6. 主函数: 在主函数中调用上述函数,实现CRUD操作。

    int main() {
        const char *db_file = "contacts.db";
    
        // 创建数据库和表
        if (create_database(db_file)) {
            return 1;
        }
    
        // 创建联系人
        if (create_contact(db_file, "Alice", "alice@example.com", "123-456-7890")) {
            return 1;
        }
    
        // 读取联系人
        printf("Contacts:\n");
        if (read_contacts(db_file)) {
            return 1;
        }
    
        // 更新联系人
        if (update_contact(db_file, 1, "Alice Smith", "alice.smith@example.com", "987-654-3210")) {
            return 1;
        }
    
        // 读取更新后的联系人
        printf("Updated Contacts:\n");
        if (read_contacts(db_file)) {
            return 1;
        }
    
        // 删除联系人
        if (delete_contact(db_file, 1)) {
            return 1;
        }
    
        // 读取删除后的联系人
        printf("Contacts after deletion:\n");
        if (read_contacts(db_file)) {
            return 1;
        }
    
        return 0;
    }

这个示例代码展示了如何使用C语言和SQLite实现一个简单的CRUD应用。你可以根据自己的需求进行修改和扩展。需要注意的是,这个示例代码没有进行充分的错误处理和安全检查,在实际应用中需要进行完善。例如,应该使用预编译语句来防止SQL注入攻击,并对用户输入进行验证。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

384

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

609

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

351

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

256

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

594

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

520

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

636

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

599

2023.09.22

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

4

2026.01.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Rust 教程
Rust 教程

共28课时 | 4.3万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.4万人学习

Go 教程
Go 教程

共32课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号