我想在我的API函数中强制使用固定长度的字符串。因此,我通过功能签名通知客户。
我使用单个字段定义一个结构,而不是简单的'char *'字符串,该字段是固定长度的字符串作为输入。此参数是客户端负责的输出参数。
这是一个描述我所做的示例代码:
#define STR_LEN 64
struct buf {
char str[STR_LEN];
}
void calc_str(struct buf * b);
这是使用固定长度字符串参数强制执行客户端的可接受方式吗?
答案 0 :(得分:1)
一种方法是通过
boolean
varSize
所以,例如,在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