我需要在尝试使用static const char [].snprintfstrcat中输入一个元素,但是由于char数组包含一些NULL字符,因此它不适用于我的情况。

    char SBP_BASE_LAT[] = "surveyed_position""\x00""surveyed_lat""\x00";


我有类型为float的变量position_lati,我想将其输入到SBP_BASE_LAT中,例如

    float position_lati = 43.456745;
    char SBP_BASE_LAT[] = "surveyed_position""\x00""surveyed_lat""\x00"["%f",position_lati];


解决办法是什么?
谢谢;

最佳答案

您提出的这份声明...

char SBP_BASE_LAT[] = "surveyed_position""\x00""surveyed_lat""\x00";


...将SBP_BASE_LAT声明为char的数组,其大小从其初始值设定项-32(包括附加的终止符)派生出来(如果我已正确计算)。数组元素不是const

像您一样在数组的初始化程序中包含空字节是合法的,但是这样做的用处似乎令人怀疑。所有处理字符串的标准函数都会将第一个嵌入的空字节解释为字符串终止符,如果这就是您想要的,则不清楚为什么要使用更长的初始化程序。


  我有一个float类型的变量position_lati,我想将其输入到SBP_BASE_LAT [...]


您不能通过初始化程序执行此操作,因为初始化程序必须是编译时常量。您可以在运行时这样做,如下所示:

float position_lati = 43.456745;
/* plenty of extra space to append the formatted value: */
char SBP_BASE_LAT[50] = "surveyed_position""\x00""surveyed_lat""\x00";
int base_lat_end;

/*
 * compute the combined length of the first two zero-terminated
 * segments of SBP_BASE_LAT
 */
base_lat_len = strlen(SBP_BASE_LAT) + 1;
base_lat_len += strlen(SBP_BASE_LAT + base_lat_len) + 1;

/*
 * Format the value of position_lati into the tail of
 * SBP_BASE_LAT, following the second embedded zero byte.
 */
sprintf(SBP_BASE_LAT + base_lat_len, "%9.6f", position_lati);


当然,所有这些都假定position_lati的值要到运行时才知道。如果在编译时知道该值,则可以将该值从字面上放入数组初始化器中。

另外,如果您的数组实际上是const,则您无法在初始化后修改其内容,因此,我所描述的基于sprintf()的方法将行不通。

关于c - 使用变量将元素输入到char数组中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36427102/

10-09 07:34
查看更多