【问题标题】:How to convert unsigned short to string in C? [duplicate]如何在 C 中将 unsigned short 转换为字符串? [复制]
【发布时间】:2020-12-19 08:14:19
【问题描述】:

我不熟悉C编程,习惯在C#中通过ToString()将一些变量转换为字符串。

但是现在我需要为一些嵌入式 Linux 系统写一个类似的 C 函数。

最常用的方法是什么?

例如:

unsigned short a = 1234;
char* a_string = malloc(5);

char* ToString(unsigned short v)
{
    char* str
    ...
    ...
    return str;
}

int main()
{
    a_string = ToString(a);
}
// result : a_string[0] = '1',  a_string[1] = '2', a_string[2] = '3', a_string[3] = '4', a_string[4] = '\0'

我会很感激一些提示或方向。

【问题讨论】:

  • sprintf和朋友们。
  • char* a_string = malloc(5); 后跟 a_string = ToString(a); 是潜在的内存泄漏。更不用说你通常不应该使用全局变量。
  • 是的,sprintf()(为了安全起见,snprintf()!)是最通用的方式。
  • 要解决您的问题,请访问 - geeksforgeeks.org/…
  • @Someprogrammerdude:说句公道话,你说通常从不,不管这可能意味着什么;-) 但我们不要在这里跑题。我们同意不应该将全局变量用于 OP 在这里试图实现的目标。

标签: c


【解决方案1】:
char * a_string = malloc(128);
snprintf(a_string, 128, "%u", a);

请参阅man pages for printf(3) 了解更多信息。

简而言之,printf 和朋友们使用 format string,它可以包含一堆占位符,表示要遵循的参数的格式。在上面,我们只使用了%u,它是unsigned int 的格式占位符。使用sprintf,我们将结果写入第一个参数(a_string)的缓冲区,而不是标准输出。

snprintf 变体是出于安全考虑,以保证我们写入的内容不会超过缓冲区大小(此处为 128,但您应该考虑一下您通常想要什么)。由于 C 字符串是以 null 结尾的,因此我们不使用所有缓冲区大小并不重要。将a_string 解释为字符串的代码不会考虑比snprintf 写入的缓冲区更多的缓冲区。

此答案缺少错误处理:如果snprintf 返回的值至少为大小参数(此处为128),则它必须截断其输出。如果返回负数,则发生错误。您需要处理这些情况。

PS:如果您处于嵌入式设置中,并且您在编译时知道输出字符串的大小(您可能知道,因为您知道 unsigned short 的大小),您可能想要使用字符串缓冲区的堆栈上的数组,而不是堆分配它。

【讨论】:

  • 可以使用snprintf获取生成字符串的长度,因此可以只分配需要的数量。
  • 这是一个非常好的观点!
猜你喜欢
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多