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

时间:2018-11-24 17:29:39

标签: c strcpy

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

#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;
}

这里使用了一个演示函数,该函数返回NULL来说明我的问题。 我本想在将src粘贴到strcpy之前进行检查,但我真的不明白为什么strcpy返回dest而不检查src是否为NULL是否。

为什么会这样,因为我看到strcpy手册只说了dest的返回,如果失败则什么也没说:

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

1 个答案:

答案 0 :(得分:1)

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

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,因为它已被写入。