如何在C中获取对象中所有字符串的长度

时间:2019-06-24 10:43:06

标签: c string typedef

我有一个结构,其中包含7个不同的字符串。我需要找到对象中这些字符串的总长度。这是我的类型:

CREATE procedure [dbo].[sp_test]       
    @inputquery nvarchar(max)  
  AS
  BEGIN
       EXEC sp_execute_external_script
  @language =N'Python',
  @script=N'OutputDataSet = InputDataSet

    from statsmodels.tsa.api import ExponentialSmoothing, SimpleExpSmoothing, Holt
    import pandas as pd
    import numpy as np
    import statsmodels as sm
    print("Hey")
    print(InputDataSet)
    InputDataSet = InputDataSet.set_index("DateTime")

...............
................

END
GO

我不是在寻找对象的大小。我在找对象中每个字符串的长度。我已经尝试使用

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 */

但是我的目的是以最短的方式实现这一目标。

2 个答案:

答案 0 :(得分:1)

像往常一样,不清楚“短”是什么意思:您是追求紧凑代码还是高性能?

由于要利用的结构很多,我可能会选择一种数据驱动的方法:

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不足以保证上述要求。

答案 1 :(得分:0)

正确的方法是简单地枚举成员:

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]);

同时断言没有填充(标准不保证填充,而是为了 仅包含字符的结构,应该为true):

_Static_assert(sizeof(report_data_t)==7*250,"");