Fork me on GitHub
0%

libc部分库函数说明

strtok

参考文章:strtok和strtok_r的使用要点和实现原理

字符分隔函数最好使用 strsep 而最好不要使用strtok,

第一个参数源字符串一定为字符串数组变量,不能是字符串常量。因为字符串常量禁止修改!!

  • 头文件:#include <string.h>

    声明:char *strtok(char *str, const char *delim);

  • 参数及返回值

    源字符串数组指针,分隔符字符串指针;

    放回值为指向被分割的子串的指针

  • 函数功能:

    对字符串s,以delim为分隔符将s切分为一个个子串

  • 实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <stdio.h>
    #include <string.h>

    int main()
    {
    char* nbaName = "jordan,james,kobe,curry";
    char cbaName[] = "yaoMing,yijianLian,wangzhiZhi,zhouQi";
    char *ptr = NULL;
    char name[32] = {0};
    #if 1
    // for(ptr=strtok(nbaName,","); ptr; ptr=strtok(NULL,",")) // error
    for(ptr=strtok(cbaName,","); ptr; ptr=strtok(NULL,",")) // right
    printf("%s\n", ptr);
    #else
    memcpy(name, nbaName, strlen(nbaName));
    for(ptr=strtok(name,","); ptr; ptr=strtok(NULL,","))
    printf("%s\n", ptr);
    #endif
    return 0;
    }

access

  1. linux头文件 : <unistd.h>

    声明 : int access ( const char * pathname , int mode)

  2. 作用 : 该函数同来判断指定文件或者目录是否有mode对应的属性. 有效返回0, 否则返回-1

  3. 参数介绍:

    pathname 时文件的路径名字 + 文件名

    mode value meaning
    F_OK 0 判断文件是否存在
    X_OK 1 判断文件是否有可执行权限
    W_OK 2 判断文件是否有写权限
    R_OK 3 判断文件是否有读权限

    后面三种可以通过“ | ”的方式一起使用,例如 : W_OK | X_OK

  4. windows头文件 : <io.h>

    声明 : int _access(const char* _Filename, int _AccessMode);

    使用与linux同, 存在(00)、仅读(04)、仅写(02)、既可读又可写(06)权限

    如果mode传入的值不是0或2或4或6,调用此函数则会crash

c_str( )

  1. c++ 头文件 :

    声明 : const char* c_str() const

  2. 返回值:

    c_str()函数返回一个指向C字符串的指针常量,即是const char*的,不能直接赋值给char*
    这将与c语言兼容,c_str()把string 对象转换成c中的字符串样式

  3. 使用方式

    1
    2
    3
    char c[20]; 
    string s="1234";
    strcpy(c,s.c_str());

strtoul( )

  1. c头文件<stdlib.h>

声明:unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr,int base);

  1. 参数及返回值

    • 参数nptr:字符串的起始地址
    • 参数endptr: 返回字符串有效数字的结尾地址。如 123456fe789 则返回数字f的地址。
    • 参数base:转化基数。参数 base 范围从2 至36,或0。参数 base 代表 nptr 采用的进制方式,如 base 值为10 则采用 10 进制,若 base 值为16 则采用16 进制数等。
  2. 功能描述

    convert a string to an unsigned long integer(把输入的字符串转换成数字).
    strtoul() 会扫描参数nptr 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(‘\0’)结束转换,并将结果返回。

  3. 注意

    • 当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 ‘0x’ / ‘0X’ 前置字符则会使用 16 进制转换,遇到 ‘0’ 前置字符则会使用 8 进制转换。
    • 若 endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,则表示该参数无效,或不使用该参数。本文最后的范例没有展示 endptr 参数的使用,你可以参考 strtol() 函数的范例来更加直观地了解 endptr 参数。
  4. 实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18

    #include <stdio.h>
    #include <stdlib.h>
    int main ()
    {
    char buffer [256];
    unsigned long ul;
    char * endptr;
    while(1)
    {
    printf ("Enter an unsigned number: ");
    fgets (buffer, 256, stdin);
    ul = strtoul (buffer, &endptr, 10);
    printf ("Value entered: %lu ,the address of the first invalid character is %d ,invalid character=%s\n", ul,endptr,endptr);
    system("pause");
    }
    return 0;
    }

snprintf( )

  1. c头文件 : <stdio.h>

    声明:int snprintf(char *str, size_t size, const char *format, …);

  2. 参数及返回值

    str为要写入的字符串;n为要写入的字符的最大数目,超过n会被截断;format为格式化字符串,与printf()函数相同;argument为变量。

    成功则返回参数str 字符串长度,失败则返回-1,错误原因存于errno 中。

  3. 函数功能

    写入字符串

  4. 实例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    int main()
    {
    char str[5];
    int ret = snprintf(str, 3, "%s", "abcdefg");
    printf("%d\n",ret);
    printf("%s",str);
    return 0;
    }

fork/exec

  • fork

    调用fork可以创建一个新的进程称为子进程, 调用fork函数的进程称为父进程, 子进程的所有内容都和父进程相同, 除了pcb(进程控制模块)。如果这两个进程都没有对内存做写操作的话, 那么两个进程共享调用fork函数的进程的内存页, 这样表面上看fork创建进程比exec创建进程快. 但只要两个进程其中一个对内存做了修改, 那么在修改之前, 就会把内存页复制一份给子进程用(写时复制)

  • exec

    调用exec创建进程, 实际上不是创建进程, 更准确的说是加载可执行文件, 调用exec后会把exec中指定的可执行文件加载到调用exec的进程的空间内, 并把调用exec的进程的内存更新为exec中指定的可执行文件的内容.