什么是处理 strcpy 的 return 类型的正确方法

Whats the proper way to handle strcpy's return type

我创建了一个程序,但在某些时候变成了一个有问题的程序,我找不到一个好的方法来处理如下程序中的情况:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int get_user_name( char *const dest, char *const src );
char *foo( char *variable ); /// foo() returns NULL

int main( void )
{
    char arr[256]      = { 0 };
    char buffer[ 256 ] = { 0 };
    char *const ptr    = foo( arr ); /// foo() returned NULL here

    if ( get_user_name( buffer, ptr ) == 0 ) /// get_user_name, should here return 0
    {
        printf("NULL returned from get_user_name()\n" );
        exit( EXIT_FAILURE );
    }else
    {
        printf( "Everithing is OK" );
    }
}

int get_user_name( char *const dest, char *const src )
{
    char *ret = strcpy( dest, src ); /// Here Segfault happens
    /// There is no return here because of above Segfault
    if ( ret == NULL )
    {
        return 0;
    }else
    {
        return 1;
    }
}

char *foo( char *variable )
{
    if ( strlen( variable) < 1 )
    {
        return NULL;    /// Here will return NULL because there is no Length
    }
    /// Some code here ...
    return variable;
}

这里使用一个演示函数 returns NULL 来解释我的问题。 我想在将 src 传递到 strcpy 之前检查它,但我真的不明白为什么 strcpy returns dest 不检查 src 是否是NULL与否。

为什么会发生这种情况,因为我看到 strcpy 手册只说了 dest 的 return,如果失败则什么也没有:

   RETURN VALUE
   The strcpy() and strncpy() functions return a pointer to the destination string dest.

您通过首先检查参数不为空来处理这种情况。例如:

int get_user_name( char *dest, char *const src )
{
    char *ret;
    if (dest==0 || src==0) return 0;
    strcpy( dest, src );
    return 1;
}

另请注意,dest 不能是 const,因为它被写入。