c - 在 C 中,如何确保初始化字符串的长度小于指定的长度

标签 c string initializer

我有一个 struct,其中一个成员是最大长度为 N 的字符串。定义:

typedef struct
{
    const char foo[N];
} bar_t;

我希望这个结构的用户初始化长度不超过 fooN 成员:

bar_t mybar = { .foo = "12345678" };

其中 N=8 。由于我无法控制 bar_t 的所有初始化,如果 bar_t.foo 的长度大于 N,我想依靠编译器生成警告/错误。

问题是为了考虑终止符(为了能够将 bar_t.foo 用作普通字符串),我需要指定长度为 bar_t.fooN+1

或者,我可以将 bar_t.foo 的长度设置为 N,并在使用长度为 > N 的字符串初始化时获得编译器警告,但我现在需要明确预期的字符串长度(即使用 strn*() 函数族,其中 N 作为最大长度参数)在使用需要终止符的函数时。

有没有办法让编译器限制初始化器的长度,并且能够在不明确最大字符串长度的情况下处理该字段?

最佳答案

GCC 不会警告字符串初始化程序比分配的内存长,因为它是完全合法的。但是您可以使用类似于以下内容的宏和静态断言来提供编译时检查:

#include <stdio.h>

#define N 6
typedef struct
{
    const char foo[N];
} bar_t;

#define INIT_FOO(var, initString) \
     _Static_assert(sizeof(initString) < N, "Bad length!"); \
     bar_t var = { .foo = initString };

INIT_FOO(mybar, "Good");
//INIT_FOO(mybar, "Baaaad");

int main(void) {
    printf("%s\n", mybar.foo);
    return 0;
}

ideone 上查看实际效果

关于c - 在 C 中,如何确保初始化字符串的长度小于指定的长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43333536/

相关文章:

c - Linux内核中的链表卡住机器

Swift: "failable initializer ' init( )' cannot override a non-failable initializer"对比默认参数

c++ - 在 C++ 的构造函数初始化列表中初始化结构

swift 初始化程序同时可选和非可选?

string - Go 中具有巨大字符串长度的单元测试覆盖率?

c++ - 有效地实现下限/欧几里得整数除法

c - 单精度 float 在零附近时的近似分辨率是多少

c - 为什么从 OpenCV 中的 XML 文件加载会破坏我的数据?

vba - VBA 中的 StringFromIID - 避免手动管理内存的好方法是什么?

java - 如何检查输入是否等于数组中的字母?