在C API上执行固定长度的字符串

时间:2015-12-17 07:57:21

标签: c

我想在我的API函数中强制使用固定长度的字符串。因此,我通过功能签名通知客户。

我使用单个字段定义一个结构,而不是简单的'char *'字符串,该字段是固定长度的字符串作为输入。此参数是客户端负责的输出参数。

这是一个描述我所做的示例代码:

#define STR_LEN 64
struct buf {
    char str[STR_LEN];
}

void calc_str(struct buf * b);

这是使用固定长度字符串参数强制执行客户端的可接受方式吗?

3 个答案:

答案 0 :(得分:1)

一种方法是通过

  1. 通过返回boolean
  2. 通知客户他/她的电话是否成功
  3. 通过函数声明指示他必须提供参数varSize
  4. 所以,例如,在C中你可以做类似的事情,

    //gives char return, and varSize input, the output here would be *myStruct
    char createStruct (MyStruct* myStruct, int varSize){
        if (varSize != STR_LEN)
            return 0; //zero indicating false
        //length is acceptable, do something else
        return 1; //return this when everything is okay
    }
    

答案 1 :(得分:1)

添加到@ Ian的答案,您可以在API中提供不透明的结构:

struct you_cant_see_inside_me;

不要在API中提供结构的内部结构 - 隐藏结构定义:

api.h

struct you_cant_see_inside_me;
struct you_cant_see_inside_me *createStruct( const char *data );
freeStruct( struct you_cant_see_inside_me *s );
int yourAPIcall( struct you_cant_see_inside_me *s );

在您的代码中,您不分发:

struct you_cant_see_inside_me
{
    char data[ 64 ];
};

struct you_cant_see_inside_me *createStruct( const char *data )
{
    struct you_cant_see_inside_me *s = malloc( sizeof( *s ) );
    // copy data to your satisfaction here, return NULL if
    // you don't like what you've been passed - you can set
    // errno to EINVAL to indicate invalid arguments
    return( s );
}

freeStruct( struct you_cant_see_inside_me *s )
{
    free( s );
}

您仍然存在拒绝某些地方不符合条件的输入的问题。

以下是一个简单示例的链接:http://c-faq.com/struct/sd1.html

答案 2 :(得分:0)

是的,你可以定义一个宏并使用修复长度字符串。

更容易定义宏的方法是在头文件中定义它并在其中使用保护器。比方说我们有标题test.h

如果没有定义STR_LEN,那么它将被定义,如果定义,链接时不会出现多重定义。

#ifndef STR_LEN
#define STR_LEN 64
#endif