【问题标题】:format specifier for short integer短整数的格式说明符
【发布时间】:2010-06-01 19:26:12
【问题描述】:

我没有正确使用 C 中的格式说明符。几行代码:

int main()
{
        char dest[]="stack";
        unsigned short val = 500;
        char c = 'a';

        char* final = (char*) malloc(strlen(dest) + 6);

        snprintf(final, strlen(dest)+6, "%c%c%hd%c%c%s", c, c, val, c, c, dest); 

        printf("%s\n", final);
        return 0;
}

我想要的是复制到

final [0] = 一个随机字符 final [1] = 一个随机字符 final [2] 和 final [3] = 短数组 final [4] = 另一个字符 ....

我的问题是我想将 short int 的两个字节复制到最终数组的 2 个字节。

谢谢。

【问题讨论】:

    标签: c++ c debugging format-specifiers


    【解决方案1】:

    我很困惑 - 问题是您说 strlen(dest)+6final 字符串的长度限制为 10 个字符(加上一个空终止符)。如果您说strlen(dest)+8,那么将有足够的空间容纳完整的字符串。

    更新

    即使一个short 的大小可能只有2 个字节,但当它作为字符串打印时,每个字符都会占用一个字节。所以这意味着如果你要写一个大于 10000 的数字,它最多需要 5 个字节的空间来写一个短字符串。

    现在,如果您使用%x 格式说明符将short 作为十六进制数字写入字符串,它将占用不超过2 个字节。

    【讨论】:

    • 我想添加 4 个字节(4 个字符)和 2 个短整数,即 6 个字符
    • @cateof:但是当您的短整数格式化为字符串时,最多可以使用 5 个字符(字节)。在这种情况下它使用 3 (500)。
    • @cateof 您忘记了 NULL 字符,当您将短字符串转换为字符串时,它变为“500”,即三个字符长并占用三个字节。我相信最大短是 32767,所以你应该留出 5 个字节的空间以确保它适合
    • 它是无符号的,所以最大值是65535。但它仍然是五个字符。
    【解决方案2】:

    您需要为 13 个字符分配空间 - 而不是 11 个。不要忘记终止 NULL。

    【讨论】:

      【解决方案3】:

      格式化后,数字 (500) 占用三个空格,而不是一个。所以你的snsprintf 应该给出最终长度为strlen(dest)+5+3。然后还修复您的malloc 调用以进行调整。如果您想计算号码的strlen,请使用类似strlen(itoa(val)) 的调用来执行此操作。另外,不能忘记dest末尾的NULL,但我认为strlen考虑到了这一点,但我不确定。

      【讨论】:

        【解决方案4】:

        简单的答案是您只为 strlen(dest) + 6 个字符分配了足够的空间,而实际上看起来您将有 8 个额外的字符......因为您的号码中有 2 个字符 + 3 个字符+ 分配 11 个字符时 + dest(5 个字符)= 13 个字符之后的 2 个字符。

        【讨论】:

          【解决方案5】:

          Unsigned shorts 最多可以包含 5 个字符,对吗? (0 - 65535)

          似乎您需要为 unsigned short 分配 5 个字符以涵盖所有值。

          这将指向使用这个:

          char* final = (char*) malloc(strlen(dest) + 10);
          

          【讨论】:

            【解决方案6】:

            您丢失了一个字节,因为您认为 short 变量占用了 2 个字节。但它需要三个:每个数字字符一个('5','0','0')。您还需要一个'\0' 终止符(+1 字节)。

            ==> 你需要strlen(dest) + 8

            【讨论】:

            • 一个,好的。那就是问题所在。所以我需要再试一次。我想创建一个 char 数组,其中包含第一个字节 = 一个随机字符 第二个字节 = 一个随机字符第三个和第四个字节 = 一个短整数第 5 个字节 = 一个随机字符。那么如何将 short int 复制到字节数组中呢?
            • 最好澄清您的问题以反映这些更新的要求。
            【解决方案7】:

            使用 8 而不是 6:

            char* final = (char*) malloc(strlen(dest) + 6);
            

            snprintf(final, strlen(dest)+6, "%c%c%hd%c%c%s", c, c, val, c, c, dest);
            

            【讨论】:

              【解决方案8】:

              似乎主要的误解是“2 字节”短字符不能在屏幕上表示为 2 个 1 字节字符。

              首先,留出足够的空间:

              char* final = (char*) malloc(strlen(dest) + 9);
              

              1 字节字符的整个可能值范围均不可打印。如果你想在屏幕上显示并且可读,你必须将 2 字节短编码为 4 个十六进制字节,例如:

              ## as hex, 4 characters
              snprintf(final, sizeof(final), "%c%c%4x%c%c%s", c, c, val, c, c, dest);
              

              如果您将其写入文件,没关系,您可以尝试以下操作:

              ## print raw bytes, upper byte, then lower byte.
              snprintf(final, sizeof(final), "%c%c%c%c%c%c%s", c, c, ((val<<8)&0xFF), ((val>>8)&0xFF), c, c, dest); 
              

              但这对人类来说是没有意义的,而且对字节顺序很敏感。我强烈建议不要这样做。

              【讨论】:

              • 另一个警告 - 原始字节 snprintf 语句仅适用于 unsigned 短整数。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2014-05-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-07-01
              • 2015-07-29
              • 1970-01-01
              相关资源
              最近更新 更多