如何使用sprintf将uint_64类型的数组追加到char数组?

时间:2019-02-27 09:47:14

标签: c++ c printf

我想使用sprintf将ID[10]中的数据附加到dispvar中。但是问题在于ID是uint64_t类型,而dispvarchar类型。因此,当我尝试下面的代码时,我只获得存储在ID后面的dispvar中的第一个值。如何将ID的全部内容附加到dispvar

char dispvar[150]={0};

union Device_Details{
    struct DeviceDetails{
        uint64_t FirmwareID[10];
        uint64_t No_of_Mot;
        uint64_t ID[10];
        uint64_t RTC_Data[7];
        uint64_t BatStat;       
    }Device;
    uint64_t Buffer[11];
}DeviceData;

sprintf(dispvar,"\n Device ID is %s", ( char *)ID);

ID是通过我的应用设置的,因此,如果我从我的应用中将ID设置为“ Hello”,则ID会类似于-ID [0] ='H',ID [1] ='e',ID [2] =' l',ID [3] ='l',ID [4] ='0';每个都是无符号long long类型的索引。

IMAGE

2 个答案:

答案 0 :(得分:1)

ID值显然包含以零结尾的字符数据,至少这就是我在下面假设的情况。

char buffer[11];
for (int i = 0; i < 10; ++i)
    buffer[i] = ID[i];
buffer[10] = '\0';
sprintf(dispvar,"\n Device ID is %s", buffer);

答案 1 :(得分:1)

几乎没有必要进行转换,因为数据存储在uint64_t数组中。

// first populate the dispvar with initial string
int idx = sprintf(dispvar, "\n Device ID is ");

// we have the array
uint64_t ID[10] = { 'H', 'e', 'l', 'l', 'o', '\0' };
// for each element in ID
for (size_t i = 0; i < sizeof(ID)/sizeof(*ID); ++i) {
      // assert(isprint(ID[i])); // extra assertion
      // we put the ID[i] into our dispvar
      dispvar[idx++] = ID[i];
      // null terminte character is also copied. We need to break.
      if (ID[i] == '\0') {
           break;
      }
}

// should work as expected
printf("%s\n", dispvar);

无法使用sprintf执行此操作。您还可以手动将数组复制到char缓冲区中,然后调用sprintf

相关问题