【问题标题】:c - char array isn't printing every valuec - char 数组没有打印每个值
【发布时间】:2016-02-29 23:43:27
【问题描述】:

我目前正在创建一个加密/解密应用程序作为练习,为此我一直在尝试使用 snprintf 将整数转换为 char 数组,但是,例如,如果我有一个 4 位数的整数,它只会添加前 3. 到目前为止,这是我的代码:

int encrypt(int num, bool type)
{
    char buffer[sizeof(num)];
    snprintf(buffer, sizeof(buffer), "%d", num);
    printf(buffer);
    return 0;
}

任何帮助都会很棒!

【问题讨论】:

  • char buffer[snprintf(NULL, 0, "%d", num)+1];
  • 请阅读sizeof 运算符的作用。
  • snprintf 只会将 sizeof(buffer)-1 个字符写入缓冲区,因为它需要为空终止符留出空间。

标签: c arrays char int


【解决方案1】:

缓冲区的大小应足以容纳转换的数字加上最终的'\0' 和潜在的减号。 sizeof(num)int 变量的字节数,很可能是4,不足以转换大于999 的数字,但snprintf 不会写入超过缓冲区大小包括最后的@ 987654326@,因此只有前 3 位数字。

您可以假设int 的大小并将buffer 定义为:

char buffer[12]; /* large enough for -2147483648 */

或者您可以精确且便携地做到这一点:

char buffer[sizeof(num) * CHAR_BIT / 3 + 3];

【讨论】:

  • 我怀疑 OP 在这里需要 sizeof(num),因为该值与 num 的值无关。如果这真的是他想要的,他应该使用sizeof int
  • @FredK:我不同意:建议使用sizeof(num),因为不管实际的整数类型如何,它都可以工作,以后可能会更改为long 甚至long long。当类型在一个地方更改而不在其他地方更改时,复制类型是导致错误的常见原因。
猜你喜欢
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
相关资源
最近更新 更多