将浮点数传递到C中的字符串中

时间:2019-12-10 15:54:18

标签: c string

如何将变量添加到字符串中?我想发送实际值为depth的字符串。那么如何将其添加到消息中呢?

float depth = ((pressure) / (g)) * 100;
char message[] = "$DBS,,f,depth,M,,,F*hh<CR><LF>";  //Put actual depth here

4 个答案:

答案 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);