如何确定char数组的大小真的需要?

时间:2014-10-22 14:19:18

标签: c arrays printf

我对以下代码有疑问:

void testing(int idNumber)
{
    char name[20];

    snprintf(name, sizeof(name), "number_%d", idNumber);
}

char数组name的大小为20,所以如果idNumber111则有效,但实际的idNumber为111111111111111111111111111111,如何确定char数组应该有多大才能保持snprintf的结果?

5 个答案:

答案 0 :(得分:3)

好吧,如果您的平台上int是32位,那么它可以打印的最宽值是21亿,即11个字符,因此number_需要7个,11个对于%d,对于null终止符为1,因此总共为19。

但是你应该检查snprintf()的返回值,以确保你有足够的空间。例如,如果“区域设置”设置为标准“C”之外的其他区域,则可以打印数千个分隔符,在这种情况下,您需要多于2个字符。

答案 1 :(得分:2)

查看snprintf的文档。如果为目标传递NULL而为大小传递0,则它将返回所需的字节数。所以你首先要做的就是对内存进行malloc操作,并使用正确的大小做另一个snprintf。

所有printf函数都返回打印的字节数(不包括尾随零),除非长度不受限制,否则snprintf将返回 打印的字符数。

答案 2 :(得分:2)

只有一个好的答案:
snprintf本身(传递长度为0)。

如果缓冲区足够大,则返回它将写入的输出的大小,不包括终止0。

man-page for snprintf

标准报价(C99 +修正案):

  

7.21.6.5 snprintf函数

     

概要

#include <stdio.h>
int snprintf(char * restrict s, size_t n,
const char * restrict format, ...);
     

描述
  2 snprintf函数等效于fprintf,但输出被写入   数组(由参数s指定)而不是流。如果n为零,则不写任何内容,   并且s可以是空指针。否则,输出超出n-1 st的字符   丢弃而不是写入数组,并在末尾写入空字符   实际写入数组的字符。如果在对象之间进行复制   重叠,行为是不确定的   返回
  3 snprintf函数返回已写入的字符数   已n足够大,不计算终止空字符,或负数   如果发生编码错误,则为value。因此,空终止输出已经   当且仅当返回的值是非负且小于n时才完全写入。

答案 3 :(得分:1)

引自here

  

如果结果字符串长度超过n-1个字符,则为   剩余的字符将被丢弃并且不会被存储,但会计入   函数返回的值。

答案 4 :(得分:1)

要使用适当大小的缓冲区,请计算其最大需求。

#define INT_PRINT_SIZE(i) ((sizeof(i) * CHAR_BIT)/3 + 3)

void testing(int idNumber) {
  const char format[] = "number_%d";
  char name[sizeof format + INT_PRINT_SIZE(idNumber)];
  snprintf(name, sizeof(name), format, idNumber);
}

此方法假定为C语言环境。可以使用更强大的解决方案

  ...
  int cnt = snprintf(name, sizeof(name), format, idNumber);
  if (cnt < 0 || cnt >= sizeof(name)) Handle_EncodingError_SurprisingLocale().

类似于https://stackoverflow.com/a/26497268/2410359