如何将变量添加到字符串中?我想发送实际值为depth
的字符串。那么如何将其添加到消息中呢?
float depth = ((pressure) / (g)) * 100;
char message[] = "$DBS,,f,depth,M,,,F*hh<CR><LF>"; //Put actual depth here
答案 0 :(得分:7)
我建议使用snprintf()
,用法与printf()
和建议的sprintf()
类似,但是您有一个用于字符串最大长度的参数。
这样可以避免缓冲区溢出。
depth = ((pressure)/(g))*100;
char message[100];
snprintf(message, sizeof message, "$DBS,,f,%f,M,,,F*hh\r\n", depth );
如果字符串更大,则可以通过检查返回值来容纳该数组
int length = snprintf(message, sizeof message, "$DBS,,f,%f,M,,,F*hh\r\n", depth );
if (length > sizeof message)
{
//do something to handle if neccessary
}
在链接的文章中,您可以找到说明符和修饰符的列表,这些说明符和修饰符可用于修改字符串中的float格式,这可能非常有用。根据您的数字数量,您可能希望使用%e(十进制指数表示法或通常称为工程表示法)。另外,您可以影响使用多少个数字和其他东西。真的值得一试。
或者,您可以签出http://www.cplusplus.com/reference/cstdio/snprintf/和http://www.cplusplus.com/reference/cstdio/printf/,这对于某些人来说更容易理解,但没有那么详细。
答案 1 :(得分:2)
尝试sprintf()
:
char message[100];
sprintf(message, "$DBS,,f,%f,M,,,F*hh<CR><LF>", depth);
深度值将到达字符串中的%f
。
答案 2 :(得分:1)
使用sprintf()
。与printf()
类似,但它在字符串中打印。
当然,目标缓冲区必须足够大以包含整个字符串:
char message[100];
float depth = ((pressure)/(g))*100;
sprintf(message, "$DBS,,f,%f,M,,,F*hh\r\n", depth );
因此%f
是转换字符,将由最终字符串中的depth值替换。为了定义小数位数,您可以使用%0.Nf
格式,该格式将以 N 小数精度显示您的值。
答案 3 :(得分:1)
如何将变量添加到字符串中?
使用sprintf()
或更好的snprintf()
。
我想使用深度的实际值传输字符串。那么如何将其添加到邮件中?
一个尚未解决的问题是如何将float depth
的所有信息传达给接收者。进入应使用的格式。
"%.*e"
,"%.*g"
和"%a"
是3个不错的选择。 "%f"
是一个较弱的选择,因为它没有提供有关小数值的信息,而没有提供有关大数值的过多数字。参见Printf width specifier to maintain precision of floating-point value
建议:
// -d. dddddddd e-ddd\0
#define STR_FLT_N (3 + (FLT_DECIMAL_DIG -1) + 6)
#define FMT "$DBS,,f,%.*e,M,,,F*hh<CR><LF>"
#define BUF_N (sizeof(format) + STR_FLT_N)
char message[BUF_N];
snprintf(message, sizeof message, FMT, FLT_DECIMAL_DIG-1, depth);