【问题标题】:C how to print short ints stored in char array?C如何打印存储在char数组中的短整数?
【发布时间】:2014-11-01 15:23:08
【问题描述】:

我有一个 char 数组并在其中存储了短整数:

char buf[50];
short int num = 12;

用 memcpy 填充它:

memcpy(buf, &num, 50);

然后我尝试将其打印出来:

for(i=0; i <50;i++) {
    printf("%hd|",buf[i]);
}

我认为%hd 应该是打印出来的正确说明符。但我的输出如下:

12|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0 |12|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|12 |0|

我的内容之间似乎是 7 字节空间(12)。但我想将 "12" 存储在每个字节中。应该可以在 char 数组中存储和缩短,我的意思是 1 个字节的最大表示是 256。我做错了什么? ... 寻找一些好的建议 =)

在linux下开发。

【问题讨论】:

  • @GrzegorzSzpetkowski,目的地是buf,不是num
  • 您编译时是否包含所有警告和调试信息 (gcc -Wall -Wextra -g)?如果你这样做了,编译器会警告你的!
  • 我没有收到任何警告 mhh

标签: c arrays memcpy


【解决方案1】:

您应该使用memset,而不是memcpy


#include<stdio.h>
#include<string.h>
int main()
{
    char buf[50];
    int i;
    short int num = 12;
    memset(buf,num,50);

    for(i=0; i <50;i++) 
    {
        printf("%hd|",buf[i]);
    }
    return 0;
}

【讨论】:

  • 我知道......我的错误应该更明显......谢谢!
【解决方案2】:

您使用了错误的函数:memcpy 而不是 memset
引用man(3) memcpy:

memcpy() 函数将 n 个字节从内存区 src 复制到内存区 dest。

如果 num 是一个至少有 n 个字节的缓冲区,那就没问题了。但是,您想为某个内存块设置一个值: memset(buff, 12, sizeof(buff)).

【讨论】:

    【解决方案3】:

    作为,

    memset() 将指定缓冲区中的所有字节设置为相同的值,memcpy() 将字节序列从另一个位置复制到缓冲区。

    所以你应该使用memset() 而不是memcpy() 函数。

    所以改变

    memcpy(buf, &num, 50);
    

    memcpy(buf, num, 50);
    

    所以你的最终代码将是..

    #include<stdio.h>
    #include<string.h>
    int main()
    {
        char buf[50];
        int i;
        short int num = 12;
        memset(buf,num,50);
    
        for(i=0; i <50;i++) printf("%hd|",buf[i]);
    
        return 0;
    }
    

    希望对你有帮助!

    【讨论】:

      【解决方案4】:

      filled it up with memcpy()。错误的。 memcpy() 不会填充数组。检查man pagememcpy() 的正确用法。

      您需要使用循环将值放入数组中。否则,您可以初始化数组(查看 memset() )以保存该值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        • 2021-07-15
        • 2012-10-12
        • 1970-01-01
        • 2016-08-30
        相关资源
        最近更新 更多