如何在C中获取对象中所有字符串的长度
How to get the length of all strings in an object in C
我有一个包含 7 个不同字符串的结构。我需要在对象中找到这些字符串的总长度。这是我的类型:
typedef struct
{
char activity [250];
char adv_MAC [250];
char PTx [250];
char refRSSI [250];
char RSSI [250];
char tick [250];
char locatorID [250];
} report_data_t; /**< BLE temporary report data struct */
我不是在寻找对象的大小。我在寻找对象中每个字符串的长度。我已经尝试使用
strlen(o1.activity);
但我的目的是以最短的方式实现。
和往常一样,不清楚 "short" 是什么意思:您追求的是紧凑代码还是高性能?
由于要利用的结构很多,我可能会采用 data-driven 方法:
size_t report_strlen(const report_data_t *r)
{
static const size_t strs[] = {
offsetof(report_data_t, activity), offsetof(report_data_t, adv_MAC),
offsetof(report_data_t, PTx), offsetof(report_data_t, refRSSI),
offsetof(report_data_t, RSSI), offsetof(report_data_t, tick),
offsetof(report_data_t, locatorID),
};
size_t len = 0;
for (int i = 0; i < sizeof strs / siezof *strs; ++i)
{
len += strlen((const char *) r + strs[i]);
}
return len;
}
再想一想,这可能不值得,我只是将所有对 strlen()
的显式调用叠加在一起,这更容易理解,7 不足以保证上述内容。
正确的方法是简单地枚举成员:
size_t sz = 0;
sz+=strlen(d->activity);
sz+=strlen(d->adv_MAC);
sz+=strlen(d->PTx);
sz+=strlen(d->refRSSI);
sz+=strlen(d->RSSI);
sz+=strlen(d->tick);
sz+=strlen(d->locatorID);
使用智能编辑器输入非常容易。
对于你的情况,你也可以简单地做:
size_t sz = 0; for(int i=0;i<7;i++) sz+=strlen(&d->activity[250*i]);
同时断言没有填充(标准不保证,但对于
一个只包含字符的结构它应该是真的):
_Static_assert(sizeof(report_data_t)==7*250,"");
我有一个包含 7 个不同字符串的结构。我需要在对象中找到这些字符串的总长度。这是我的类型:
typedef struct
{
char activity [250];
char adv_MAC [250];
char PTx [250];
char refRSSI [250];
char RSSI [250];
char tick [250];
char locatorID [250];
} report_data_t; /**< BLE temporary report data struct */
我不是在寻找对象的大小。我在寻找对象中每个字符串的长度。我已经尝试使用
strlen(o1.activity);
但我的目的是以最短的方式实现。
和往常一样,不清楚 "short" 是什么意思:您追求的是紧凑代码还是高性能?
由于要利用的结构很多,我可能会采用 data-driven 方法:
size_t report_strlen(const report_data_t *r)
{
static const size_t strs[] = {
offsetof(report_data_t, activity), offsetof(report_data_t, adv_MAC),
offsetof(report_data_t, PTx), offsetof(report_data_t, refRSSI),
offsetof(report_data_t, RSSI), offsetof(report_data_t, tick),
offsetof(report_data_t, locatorID),
};
size_t len = 0;
for (int i = 0; i < sizeof strs / siezof *strs; ++i)
{
len += strlen((const char *) r + strs[i]);
}
return len;
}
再想一想,这可能不值得,我只是将所有对 strlen()
的显式调用叠加在一起,这更容易理解,7 不足以保证上述内容。
正确的方法是简单地枚举成员:
size_t sz = 0;
sz+=strlen(d->activity);
sz+=strlen(d->adv_MAC);
sz+=strlen(d->PTx);
sz+=strlen(d->refRSSI);
sz+=strlen(d->RSSI);
sz+=strlen(d->tick);
sz+=strlen(d->locatorID);
使用智能编辑器输入非常容易。
对于你的情况,你也可以简单地做:
size_t sz = 0; for(int i=0;i<7;i++) sz+=strlen(&d->activity[250*i]);
同时断言没有填充(标准不保证,但对于 一个只包含字符的结构它应该是真的):
_Static_assert(sizeof(report_data_t)==7*250,"");