分析C语言strdup函数

Usage of strdup

它的定义在 <string.h> 文件中。
函数原型如下:

char * strdup(const char *str1);

它的作用是制作一个 str1 的副本,但这个副本和 str1 一点关系都没有,也就是说,它是独立的。
由返回值返回 str1 的副本的地址。
但它需要 free(在C++中用 delete)来释放。

Example

#include <string.h>
#include <cassert>
int main()
{
    char* str = "Hello world";
    char* str_dup;
    str_dup = strdup(str);
    assert((str_dup == str) == 0)
}

strdup 的实现

char* strdup(const char* str1)
{
    size_t len = strlen(str1) + 1; // 计算出字符串大小
    char* p = malloc(len); // 申请内存
    
    return p ? memcpy(p, str1, len) : NULL;
}

C 减少goto的几种写法

一般窝会这样写:

void
foo()
{
    if(FALSE)
    {
        goto success;
    }
    if(TRUE)
    {
        goto error;
    }
success:
    return EXIT_SUCCESS
error:
    return EXIT_FAILURE
}

为了减少goto可以这样写:

int
foo_nogoto(int _bool)
{
    do
    {
        if(_bool == 0)
            break; // goto success

        if(_bool == 1)
            return EXIT_FAILURE; // goto error

    }while(0);
    return EXIT_SUCCESS;
}

还有一种方法就是酱紫:

int
foo_nogoto(int _bool)
{
    int err;
    if(_bool == 0)
        err = 0;
    if(_bool == 1)
        err = 1;

    return err;
}

其实就连大名鼎鼎的Kernel和Nginx都用了不少goto,所以大家不要担心(大雾

strcat用法

strcat

strcat函数原型

char * strcat ( char * destination, const char * source );

头文件

<string.h>

例子

#include <stdio.h>
#include <string.h>
int main()
{
    char str[80];
    strcpy(str, "Hello ");
    strcat(str, "world");
    strcat(str, "!");
    printf("%s\n", str);
    return EXIT_SUCCESS;
}

Output:

Hello world!