精华内容
下载资源
问答
  • Klib - C语言通用库

    万次阅读 2016-02-21 21:08:08
    Klib - C语言通用库samtools,bwa等软件都会设计到这个库,在项目中也比较方便加入这个库。 来自:https://github.com/attractivechaos/klib简介Klib是C语言写成的,独立的轻量级的库,并且遵循MIT/X11声明。其中的...

    samtools,bwa等软件都会涉及到这个库,在项目中也比较方便加入这个库。
    来自:https://github.com/attractivechaos/klib

    简介

    Klib是C语言写成的,独立,轻量级,并且遵循MIT/X11声明。其中的大部分只是用到了C标准库,相互之间也是独立的。如果使用这个库中的一部分,只需要将使用到的文件拷贝到你自己的项目中即可,而不用担心库的依赖关系。

    Klib致力于高效率和比较小的内存使用。一些子库是在所有语言里的相似算法或数据结构中的最具有效能的实现,包括速度和内存,比如: khash.h, kbtree.h, ksort.h和 kvec.h

    基本子库

    • khash.h : 基于多重散列(double hashing)的散列类
    • kbtree.h : 基于B树的搜寻树
    • ksort.h : 排序类,包括 introsort, merge sort, heap sort, comb sort, Knuth shuffle和k-small算法
    • kseq.h : 流缓存类及FASTA/FASTQ格式解析
    • kvec.h : 动态数组类
    • klist.h : 单链表和内存池
    • kstring.{h,c} : 基础字符库
    • kmath.{h,c} : 包括了伪随机数生成器,基本的非线性规划和一些特殊的数学函数

    不常用的子库

    • ksa.c : 基于校正SAIS算法,实现的字符串后缀数组
    • knetfile.{h,c} : 远程文件(on HTTP or FTP)接口
    • kopen.c : 敏捷数据流打开器
    • khmm.{h,c} : 基本的HMM库
    • ksw.{h,c} : Striped Smith-Waterman algorithm
    • knhx.{h,c} : Newick树格式解析

    使用方法

    为了实现通用容器,klib广泛使用了C语言的宏定义。为了使用这些数据结构,我们需要扩展很长的宏来定义实现方法。这就使得源代码比较与众不同,甚至是丑陋,并且增加了困难性(不管是写还是读)和bug。不幸的是,在C语言中限制使用模板,为了高效率的通用容器编程只能使用C宏定义。使用宏定义后,可以很有效率的完成指定类型的容器。有一些C语言的泛型库,例如Glib,使用了void *类型去定义了容器。但是这通常会比klib慢并且会使用更多的内存。

    为了高效的使用klib,理解如何实现通用编程很重要。下面是使用hash table库的一个例子:

    #include "khash.h"
    KHASH_MAP_INIT_INT(m32, char)        // instantiate structs and methods
    int main() {
        int ret, is_missing;
        khint_t k;
        khash_t(m32) *h = kh_init(m32);  // allocate a hash table
        k = kh_put(m32, h, 5, &ret);     // insert a key to the hash table
        if (!ret) kh_del(m32, h, k);
        kh_value(h, k) = 10;             // set the value
        k = kh_get(m32, h, 10);          // query the hash table
        is_missing = (k == kh_end(h));   // test if the key is present
        k = kh_get(m32, h, 5);
        kh_del(m32, h, k);               // remove a key-value pair
        for (k = kh_begin(h); k != kh_end(h); ++k)  // traverse
            if (kh_exist(h, k))          // test if a bucket contains data
                kh_value(h, k) = 1;
        kh_destroy(m32, h);              // deallocate the hash table
        return 0;
    }
    

    在这个例子中,第二行示例了一个键类型为unsigned,值类型为char的hash table。m32是这种类型hash table的名称。m32相关的所有类型和函数都是宏定义,后面会有解释。宏kh_init()创建一个hash table,宏kh_destroy()释放hash table。kh_put()插入一个键值并返回一个hash table的迭代器(或位置)。kh_get()和kh_del()得到一个键和删掉一个元素。kh_exist()测试一个迭代器(或位置)是否存在值。

    首先遇到的问题就是这段代码看起来不像是可用的C代码(缺少分号或是未定义的m32)。为了去理解为什么这段代码是正确的,我们来看看khash.h的源码是怎么写的。

    #define KHASH_INIT(name, SCOPE, key_t, val_t, is_map, _hashf, _hasheq) \
      typedef struct { \
        int n_buckets, size, n_occupied, upper_bound; \
        unsigned *flags; \
        key_t *keys; \
        val_t *vals; \
      } kh_##name##_t; \
      SCOPE inline kh_##name##_t *init_##name() { \
        return (kh_##name##_t*)calloc(1, sizeof(kh_##name##_t)); \
      } \
      SCOPE inline int get_##name(kh_##name##_t *h, key_t k) \
      ... \
      SCOPE inline void destroy_##name(kh_##name##_t *h) { \
        if (h) { \
          free(h->keys); free(h->flags); free(h->vals); free(h); \
        } \
      }
    
    #define _int_hf(key) (unsigned)(key)
    #define _int_heq(a, b) (a == b)
    #define khash_t(name) kh_##name##_t
    #define kh_value(h, k) ((h)->vals[k])
    #define kh_begin(h, k) 0
    #define kh_end(h) ((h)->n_buckets)
    #define kh_init(name) init_##name()
    #define kh_get(name, h, k) get_##name(h, k)
    #define kh_destroy(name, h) destroy_##name(h)
    ...
    #define KHASH_MAP_INIT_INT(name, val_t) \
        KHASH_INIT(name, static, unsigned, val_t, is_map, _int_hf, _int_heq)
    

    KHASH_INIT()是一个很大的宏定义,其中定义了所有了结构和方法。用到这个宏的时候,所有的这些代码就会插入到使用他的地方。如果这个宏使用了多次,那么这段代码就有多个拷贝。为了避免不同key-value类型hash table的命名冲突,使用了##运算符来在宏定义中通过传入参数作为标记来定义不同的hash table名称。最后,在把相应带有标记的函数指代回来。

    typedef struct {
      int n_buckets, size, n_occupied, upper_bound;
      unsigned *flags;
      unsigned *keys;
      char *vals;
    } kh_m32_t;
    static inline kh_m32_t *init_m32() {
      return (kh_m32_t*)calloc(1, sizeof(kh_m32_t));
    }
    static inline int get_m32(kh_m32_t *h, unsigned k)
    ...
    static inline void destroy_m32(kh_m32_t *h) {
      if (h) {
        free(h->keys); free(h->flags); free(h->vals); free(h);
      }
    }
    
    int main() {
        int ret, is_missing;
        khint_t k;
        kh_m32_t *h = init_m32();
        k = put_m32(h, 5, &ret);
        if (!ret) del_m32(h, k);
        h->vals[k] = 10;
        k = get_m32(h, 10);
        is_missing = (k == h->n_buckets);
        k = get_m32(h, 5);
        del_m32(h, k);
        for (k = 0; k != h->n_buckets; ++k)
            if (kh_exist(h, k)) h->vals[k] = 1;
        destroy_m32(h);
        return 0;
    }

    这就是我们平常熟知的C程序了。

    从上面的例子我们可以看到,宏定义和C预编译器在klib中起到了主要作用。klib之所以快是因为在编译阶段就已经知道了key-value的类型可以优化到指定key-value类型的程度,而使用void *来构建通用库的方式是达不到这种效率的。

    从上例来看,在程序中可能会插入很多代码,通过这个我们想到C++当使用STL/boost库是编译起来很慢,并且编译完成的文件很大。klib要好很多,比较小的代码量,并且彼此独立。即使插入几百行代码也不会使编译速度变慢。

    展开全文
  • C语言通用库(跨平台)

    千次阅读 2014-08-18 09:43:30
    C语言通用库(跨平台)。 1.APR:Apache Portable Runtime 用于Apache服务器。 2.GLib:GNOME 用于开发桌面。 3.CF:Apple公司的基础库。 4.NSPR:Mozilla基金会用于客户端和红帽子服务器...
      C语言实在是太经典了,但是语言本身和标准库缺乏常用的数据结构(这也是它的经典简洁之处)。为了提高大家的开发效率不再开发“轮子”。我罗列了一些久经考验的经典库:

    1.APR:Apache Portable Runtime 用于Apache服务器。

    2.GLib:GNOME 用于开发桌面。

    3.CF:Apple公司的基础库。

    4.NSPR:Mozilla基金会用于客户端和红帽子服务器程序。
    展开全文
  • c语言通用链表

    2018-02-02 15:03:56
    本代码提供采用c语言编写链表的使用源码,有创建、初始化、删除、插入、查找等等功能
  • C语言经典

    2019-04-25 19:21:44
    已经封装好的C语言通用库,易于移植,用于嵌入式开发或者服务器开发都非常有用。
  • title date tags categories description ... C语言通用工具stdlib.h的常用函数 2020-04-02 02:09:15 -0700 stdlib C语言 介绍rand(), srand(), m...
    title date tags categories description
    C语言通用工具库stdlib.h的常用函数
    2020-04-02 02:09:15 -0700
    stdlib
    C语言
    介绍rand(), srand(), malloc(), free(), exit(), atexit(), qsort()的使用

    生成随机数

    函数原型

    int rand (void);
    void srand (unsigned int __seed);

    说明

    需要用到rand(), srand()<time.h>中的time()函数

    • rand函数是"伪随机数生成器",意思是可预测生成数字的实际序列,但是在生成范围内均匀分布,生成的随机数范围是0-RAND_MAXRAND_MAXstdlib.h中的宏
    • srand函数:用于重置随机数种子,使得rand()生成的随机数各不相同
    • time函数:将系统时间作为srand的参数

    示例

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int main(void) {
        int rand_arr[20] = { 0 };
        for (int i = 0; i < 20; i++) {
            // 用于for循环执行的很快,所以使用time和rand的和作为参数
            srand((unsigned)time(NULL) + (unsigned)rand());
            // 通过运算符可以限制随机数范围,这里是0-100
            d_arr[i] = rand() % 100;
            printf("%d ", d_arr[i]);
        }
        return 0;
    }

    内存管理

    参看另一篇博客

    exit和atexit

    函数原型

    void exit (int __status);
    int atexit (void (*__func) (void));

    说明

    • exit 用于终止程序,如果在没有递归的main函数中使用exit等同于使用return,不同之处在于即使在其他程序中或递归函数中使用exit也会终止程序,而return会将控制权交给上一级函数, exit需要一个int类型的参数,指明终止状态,在unit系统中,0代表执行成功,其他值代表失败,然而可能并不适用其他系统,所以用两个宏供使用EXIT_SUCCESS代表成功,EXIT_FAILURE代表失败 当main函数终止时,会隐式调用exit

    • atexit 指定当调用exit时执行注册的特定函数,atexit的参数是一个函数指针,该函数必须无参数无返回值,通过多次调用atexit可以注册多个函数,ANSI保证,至少可以放32个函数,而这些函数在调用exit时,执行顺序与注册顺序相反,即最后添加的函数最先执行,这些函数一般是完成清理任务,例如更新程序的文件或重置环境变量

    示例

    #include <stdio.h>
    #include <stdlib.h>
    void Done1(void);
    void Done2(void);
    int main(void)
    {
        atexit(Done1);
        atexit(Done2);
        printf("main start");
        exit(EXIT_SUCCESS);
    }
    void Done1(void)
    {
        printf("\nexit-->Done1");
    }
    void Done2(void)
    {
        printf("\nexit-->Done2");
    }

    输出

    main start
    exit-->Done2
    exit-->Done1
    

    可以看到,注册顺序为Done1->Done2,执行顺序为Done2->Done1

    排序qsort

    函数原型

    void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));

    说明

    qsort函数C语言编译器函数库自带的快速排序函数

    • 参数 base-- 指向要排序的数组的第一个元素的指针。 nitems-- 由 base 指向的数组中元素的个数。 size-- 数组中每个元素的大小,以字节为单位。 compar-- 用来比较两个元素的函数,即函数指针(回调函数)

    • compar参数 compar参数指向一个比较两个元素的函数。比较函数的原型应该像下面这样。注意两个形参必须是const void *型,同时在调用compar 函数(compar实质为函数指针,这里称它所指向的函数也为compar)时,传入的实参也必须转换成const void *型。在compar函数内部会将const void *型转换成实际类型。

    int compar(const void *p1, const void *p2);

    如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的左面; 如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定; 如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的右面。

    示例

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int mycomp(const void* p1, const void* p2);
    int main()
    {
        double d_rand = 0.0;
        double d_arr[20] = { 0 };
        for (int i = 0; i < 20; i++) {
            srand((unsigned)time(NULL) + (unsigned)rand());
            d_arr[i] = rand() % 10000 / 1000.0;
            printf("%f ", d_arr[i]);
        }
        putc('\n', stdout);
        qsort(d_arr, 20, sizeof(double), mycomp);
        for (int i = 0; i < 20; i++) {
            printf("%f ", d_arr[i]);
        }
    }
    //从小到大排序,如果更改return的值可以实现从大到小排序
    int mycomp(const void* p1, const void* p2)
    {
        const double* d1 = (const double*)p1;
        const double* d2 = (const double*)p2;
        if (*d1 > *d2)
            return 1;
        else if (*d1 < *d2)
            return -1;
        else
            return 0;
    }

    可能会疑惑为什么不使用一个标志位参数来确定正向或反向排序,原因是利用函数指针可以实现其他更复杂的排序,如下面的结构体参数

    struct Example {
        int a;
        float b;
    };

    你可以通过编写compar函数实现先用a排序,如果a相等,使用b排序

    展开全文
  • C语言 通用工具 stdlib.h

    千次阅读 2018-07-01 12:43:35
    通用工具 double atof(const char * nptr); 返回把字符串nptr开始部分的数字和符号字符转换为double类型的值,跳过开始的空白,遇到第一个非数字字符时结束转换;如果未发现数字则返回0 int atoi(const char * nptr)...

    ANSI C在stdlib.h头文件中定义了一些实用函数。

    stdlib.h中声明的类型
    size_tsizeof运算符返回的整数类型
    wchar_t用于表示宽字符的整数类型
    div_tdiv()返回的结构类型,该类型中的quot和rem成员都是int类型
    ldiv_tldiv()返回的结构类型,该类型中的quot和rem成员都是long类型
    lldiv_tlldiv()返回的结构类型,该类型中的quot和rem成员都是long long 类型(C99)

    stdlib.h中定义的常量
    NULL空指针,相当于0
    EXIT_FAILURE可用作exit()的参数,表示执行程序失败
    EXIT_SUCCESS可用作exit()的参数,表示成功执行程序
    RAND_MAXrand()返回的最大值,一个整数
    MN_CUR_MAX当前本地化的拓展字符集中多字节字符的最大字节数

    通用工具
    double atof(const char * nptr);返回把字符串nptr开始部分的数字和符号字符转换为double类型的值,跳过开始的空白,遇到第一个非数字字符时结束转换;如果未发现数字则返回0
    int atoi(const char * nptr);返回把字符串nptr开始部分的数字和符号字符转换为int类型的值,跳过开始的空白,遇到第一个非数字字符时结束转换;如果未发现数字则返回0
    int atol(const char *nptr);返回把字符串nptr开始部分的数字和符号字符转换为long类型的值,跳过开始的空白,遇到第一个非数字字符时结束转换;如果未发现数字则返回0
    double strtod(const char *restrictnpt, char ** restrictept);返回把字符串npt开始部分的数字和符号转换为double类型的值,跳过开始的空白遇到第一个非数字字符时结束转换;如果未发现数字则返回0;如果转换成功,则把数字后第一个字符的地址赋给ept指向的位置;如果转换失败,则把npt赋给ept指向的位置
    float strtof(const char * restrictnpt, char ** restrict ept);与strtod()类似,但是该函数把npt指向的字符串转换成long double类型的值(C99)
    long double strtols(const char * restrict npt, char **restrict ept);与strod()类似,但是该函数把npt指向的字符串转换成long double类型的值(C99)
    long strtol(const char * restrict npt, char ** restrict ept, int base);返回把字符串npt开始部分的数字和符号转换成long类型的值,跳过开始的空白,遇到第一个非数字字符时结束转换;如果未发现数字则返回0;如果转换成功,则把数字后第一个字符的地址赋给ept指向的位置;如果转换失败,则把npt赋给ept指向的位置;假定字符串中的数字以base指定的数为基数
    long long strtoll(const char *restrictnpt, char ** restrict ept, int base);与strtol()类似,但是该函数把npt指向的字符串转换为long long类型的值(C99)
    unsigned long strtoul(const char * restrict npt, char ** restrict ept, int base);返回把字符串npt开始部分的数字和符号字符转换为unsigned long 类型的值,跳过开始的空白,遇到第一个非数字字符时结束转换;如果未发现数字则返回0;如果转换成功,则把数字后第一个字符的地址赋给ept指向的位置;如果转换失败,则把npt赋给ept指向的位置;假定字符串中的数字以base指定的数为基数
    unsigned long long strtoull(const char * restrict npt, char ** restrict ept , int base);与strtoul()类似,但是该函数把npt指向的字符串转换为unsigned long long 类型的值(C99)
    int rand(void);返回0 - RAND_MAX范围内的一个伪随机整数
    void srand(unsigned int seed);把随机数生成器种子设置为seed,如果在调用rand()之前调用srand(),则种子为1
    void *aligned_alloc(size_t algn, size_t size);为对其对象algn分配size字节的空间,应该支持algn对齐值,size应该是algn的倍数(c11)
    void *calloc(size_t nmem, size_t size);为内含nmem个成员的数组分配空间,每个元素占size字节大;空间中的所有位都初始化为0;如果操作成功,该函数返回数组的地址,否则返回NULL
    void free(void *ptr);释放ptr指向的空间,ptr应该是之前调用calloc(), malloc()或realloc(0返回的值,或者ptr也可以是空指针,出现这种情况时什么也不做。如果ptr是其他值,其行为是未定义的
    void *malloc(size_t size);分配size字节的未初始化内存块;如果成功分配,该函数返回数组的地址,否则返回NULL
    void *realloc(void *ptr, size_t size);把ptr指向的内存块大小改为size字节,size字节内的内存块内容不变。该函数返回块的位置,它可能被移动。如果不能重新分配空间,函数返回NULL,原始块不变;如果ptr为NULL,其行为与调用带size参数的malloc()相同;如果size是0,且ptr不是NULL,其行为与调用带ptr参数的free()相同。
    void abort(void);除非捕获信号SIGABRT,且相应的信号处理器没有返回,否则该函数将导致程序异常结束。是否关闭I/O流和临时文件,因实现而异。该函数执行raise(SIGABRT)
    int atexit(void (*func) (void));注册func指向的函数,使其在程序正常结束时被调用。实现应支持注册至少32个函数,并根据它们注册顺序的逆序调用。如果注册成功,函数返回0;否则返回非0
    int at_quick_exit(void (*func) (void));注册func指向的函数,如果调用quick_exit()则调用被注册的函数。实现应支持注册至少32个函数,并根据它们注册顺序的逆序调用。如果注册成功,函数返回0;否则返回非0(C11)
    void exit(int status);该函数将正常结束程序。首先调用由atexit()注册的函数,然后刷新所有打开的输出流,关闭所有的I/O流,关闭tmpfile()创建的所有文件,并把控制权返回主机环境中;如果status是0或EXIT_SUCCESS,则返回一个实现定义的值,表明未成功结束程序
    void _Exit(int status);与exit()类似,但是该函数不调用atexit()注册的函数和signal()注册的信号处理器,其处理打开流的方式依照实现而异
    char *getenv(const char * name);返回一个指向字符串的指针,该字符串表示name指向的环境变量的值。如果无法匹配指定的name,则返回NULL
    _Noreturn void quick_exit(int status);该函数将正常结束程序。不调用atexit()注册的函数和signal()注册的信号处理器。根据at_quick_exit()注册函数的顺序,逆序调用这些函数。如果程序多次调用quick_exit()或者同时调用quick_exit()和exit(),其行为是未定义的。通过调用_Exit(status)将控制权返回主机环境(C11)
    int system(const char *str);把str指向的字符串传递给命令处理器执行的主机环境。如果str是NULL指针,且命令处理器可用,则该函数返回非0,否则返回;如果str不是NULL,返回值依实现而异
    void *bsearch(const void *key, const void *base, size_tnmem, size_t size, int (*comp)(const void *, const void *));查找base指向的一个数组(有nmem个元素,每个元素的大小为size)中是否有元素匹配key指向的对象。通过comp指向的函数比较各项,如果key指向的对象小于数组元素,那么比较函数将返回小于0的值;如果两者相等,则返回0;如果key指向的对象大于数组元素,则返回大于0的值。该函数返回指向匹配元素的指针或NULL(如果无匹配元素)。如果有多个元素匹配,未定义返回哪一个元素
    void qsort(void *base, size_t nmem, size_t size, int(*comp) (const void *, const void *));根据comp指向的函数所提供的顺序排列base指向的数组。该数组有nmem个元素,每个元素的大小是size。如果第一个参数指向的对象小于数组元素,那么比较函数将返回小于0的值;如果两者相等,则返回0;如果第一个参数指向的对象大于数组元素,则返回大于0的值
    int abs(int n);返回n的绝对值。如果n是负数但没有与之对应的正数,那么返回值是未定义的。当n是以二进制补码表示的INT_MIN时,会出现这种情况
    div_t div(int number, int denom);计算number除以denom的商和余,把商和余数分别存储在div_t结构的quot成员和rem成员中。对于无法整除的除法,商要直接截去小数部分
    long labs(int n);返回n的绝对值,如果n是负数但没有与之对应的正数,那么返回值是未定义的。当n是以二进制补码表示的LONG_MIN时,会出现这种情况
    ldiv_t ldiv(long number, long denom);计算number除以denom的商和余,把商和余数分别存储在ldiv_t结构的quot成员和rem成员中。对于无法整除的除法,商要直接截去小数部分
    long long llabs(int n);返回n的绝对值,如果n是负数但没有与之对应的正数,那么返回值是未定义的。当n是以二进制补码表示的LONG_LONG_MIN时,会出现这种情况
    lldiv_t lldiv(long number, long denom);计算number除以denom的商和余,把商和余数分别存储在lldiv_t结构的quot成员和rem成员中。对于无法整除的除法,商要直接截去小数部分 (C99)
    int mblen(const char *s, size_t n);返回组成s指向的多字节字符的字节数(最大为n)。如果s指向空字符,该函数则返回0;如果s未指向多字节字符,则返回-1;如果s是NULL,且多字节根据状态进行编码,该函数则返回非0,否则返回0
    int mbtowc(wchar_t *pw, const char *s, size_t n);

    如果s不是NULL,该函数确定了组成s指向的多字节字符的字节数(最大为n),并确定字符的wchar_t类型编码。如果pw不是NULL,则把类型编码赋给pw指向的位置。返回值与mblen(s, n)相同

    int wctomb(char *s, wchar_t wc);把wc中的字符代码转换成相应的多字节字符表示,并将其存储在s指向的数组中,除非s是NULL。如果s不是NULL,且如果wc无法转换成相应的有效多字节字符,该函数返回-1;如果wc有效,该函数返回组成多字节的字节数;如果s是NULL,且如果多字节字符根据状态进行编码,该函数返回非0,否则返回0
    size_t mbstwocs(wchar_t *restrict pwcs, const char *srestrict, size_t n);把s指向的多字节字符数组转换成存储在pwcs开始位置的宽字符编码数组中,转换pwcs数组中的n个字符或转换到s数组的空字节停止。如果遇到无效的多字节字符,该函数返回(size_t)(-1); 否则返回已填充的数组元素个数(如果有空字符,不包含空字符)
    size_t wcstombs(char * restricts, const wchart_t *restrict pwcs, size_t n);把存储在pwcs指向数组中的宽字符编码序列转换成一个多字节字符序列,并把它拷贝到s指向的位置上,存储n个字节或遇到空字符时停止转换。如果遇到无效的宽字符编码,该函数返回(size_t)(-1), 否则返回已经填充数组的字节数(如果有空字符,不包含空字符)





    展开全文
  • 通用PID, 包含一个C文件和一个头文件, 没有实际测试
  • c语言通用链表

    千次阅读 2017-05-08 17:04:46
    c语言通用链表 概述 c语言标准不存在链表, 所以为了数据的简单操作自己写了一份链表 代码 ############ general_list.h ############## #ifndef __GENERAL_LIST_H__ #define __...
  • c语言汉字

    2012-10-03 17:12:35
    C语言汉字通用的。。编写c语言可以调用汉字文件,然后汉字输出。不用英语了。希望采纳。。
  • GDSL (通用数据结构) 包含一组程序用于操作各种数据结构。这是一个可移植的,完全由 ANSI C 编写。为 C 开发者提供强大的算法和隐藏的数据结构操作方法。目前支持的数据结构包括:lists, queues, stacks, hash ...
  • C语言函数

    2013-03-15 15:40:08
    内容涵盖基本C/C++预处理命令、操作符优先级、转义字符、ASCII码表、基本数据类型、关键字,以及C++ 标准模板(STL)通用类模板和算法集合,提供给程序员一些标准的数据结构的实现如 queues(队列), lists(链表), 和 ...
  • 基于C语言通用数据结构和算法

    千次阅读 2015-07-02 12:04:34
    本人最近在学习数据结构的课程,在过程中发现用C语言来实现各种数据结构类型的时候很难做到真正意义上的通用的数据结构,于是在网上搜罗了一些所谓的C语言通用数据结构,在此也将这些数据结构一一罗列,方便大家...
  • 这篇文章主要介绍了在linux中使用gcc编译c语言共享的步骤,大家参考使用吧 对任何程序员来说都是必不可少的。所谓的是指已经编译好的供你使用的代码。它们常常提供一些通用功能,例如链表和二叉树可以...
  • Redis C语言客户端hiredis

    千次阅读 2013-09-25 20:06:29
    Hiredis是redis数据库一个轻量的C语言客户端。 之所以轻量是由于它只是简单的提供了对redis操作语句支持的接口,并没有实现具体的操作语句的功能。但正是由于这种设计使我们只要熟悉了通用的re
  • C语言标准stdlib.h

    2020-04-03 09:34:03
    stdlib.h == standard library标准头文件,该文件包含了C语言标准库函数的定义 stdlib.h里面定义了五种类型、一些宏和通用工具函数 类型:size_t、wchar_t、div_t、ldiv_t和lldiv_t; 宏 : EXIT_FAILURE、EXI.....
  • Hiredis是redis数据库一个轻量的C语言客户端。之所以轻量是由于它只是简单的提供了对redis操作语句支持的接口,并没有实现具体的操作语句的功能。但正是由于这种设计使我们只要熟悉了通用的redis操作语句就可以很...
  • Redis C语言客户端hiredis使用方法

    千次阅读 2016-09-03 22:52:25
    Hiredis是redis数据库一个轻量的C语言客户端。 之所以轻量,是由于它只是简单的提供了对redis操作语句支持的接口,并没有实现具体的操作语句的功能。但正是由于这种设计,使得我们只要熟悉了通用的redis操作语句...
  • 它们常常提供一些通用功能,例如链表和二叉树可以用来保存任何数据,或者是一个特定的功能例如一个数据库服务器的接口,就像MySQL。 大部分大型的软件项目都会包含若干组件,其中一些你发现可以用在其他项目中,又...
  • libcstl是使用标准C语言编写的通用数据结构和常用算法库。 libcstl模仿STL的接口形式,包括序列容器、关联容器、容器适配器、迭代器、函数和算法。libcstl为C编程中的数据管理提供了方便简易的开发。 libcstl除了...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 976
精华内容 390
关键字:

c语言通用库

c语言 订阅