2017-10-16 153 views
-2

我有代码为int转换成一个无符号的char *这样:转换无符号字符*为char *字符串C

int i = //a number <= 15; 
unsigned char * byte = (unsigned char *) &i; 

我这样做,因为我需要的是整型字节值。 后来我想把这个字节值附加到char *,所以我需要将它转换为一个字符串。

Ex. if: int i = 15; 
then: unsigned char * byte = F; 

不过,我需要将其转换为得到:

char * string = "F"; 

我曾尝试:

char * string = (char *) &byte; 
//and 
char * string = (char *) byte; 
//or just straight up treating it like a char * by going: 
printf("%s", byte); 

和其他几个组合,但他们都导致了赛格故障。有谁知道我该怎么做?或者,即使有一种更简单的方法将int转换为char中的十六进制表示形式?

我对C很陌生,非常感谢任何答案,谢谢。

+0

如果'0 <= i <= 15',看起来像'unsigned char byte =(unsigned char)i;'和'char string [2] = {(char)字节,'\ 0'};'?这听起来是对的吗,还是有超过一个字节涉及? (你真的需要'printf',还是'putchar'能正常工作?) – Ryan

+1

'char byte [2]; sprintf(byte,“%X”,(unsigned char)i); printf(“%s”,byte);' – BLUEPIXY

+0

是的,这是正确的我实际上只需要一个字节而不是一个字节数组,所以'unsigned char'就足够了。我知道“%X”是打印无符号字符的方式,但我实际上想将转换后的'char'追加到现有的'char *',而不是只打印它。 (打印语句实际上只是为了调试) – k1234

回答

2

actually want追加转换的字符到现有char *

  1. 确保目的地是足够大的。

    char existing[100]; 
    // existing is populated somehow, now to add the `unsigned char` 
    size_t len = strlen(existing); 
    // 2 is the max size of a 8-bit value printed in hex. Adjust as needed. 
    if (len + 2 >= sizeof existing) Error_BufferTooSmall(); 
    
  2. 写入已有的char *的末尾。

    // Only use the least significant `char` portion with `hh` 
    sprintf(existing + len , "%hhX", (unsigned) i); 
    

hh指定根据出下一个dioux,或X转换说明适用于signed char或unsigned char型参数(该参数将被提升整数升级,但打印前其值应为 转换为signed charunsigned char); ... C11§7.21.6.17

0
int i = //a number <= 15; 
unsigned char * byte = (unsigned char *) &i; 

是完全错误的。

你正在做的是取整数变量i的地址并放入一个指向unsigned char的指针。

从我读的,我认为你想要一个整数转换为字符(或字符串)。

你可以用itoasprintf更容易做到这一点。

例如:

#include <stdio.h> // printf, snprintf 

int main(void) { 
    int i = 255; 
    char theIntegerAsString[5] = {0}; 

    if (snprintf(theIntegerAsString, sizeof(theIntegerAsString), "%X", i) > 0) { 
     printf("The number %d in Hexadecimal is: %s\n", i, theIntegerAsString); 
    } 
} 

你可能想知道为什么我用snprintf代替sprintf

这是因为sprintf并不总是检查缓冲区大小,而snprintf总是这样做。见buffer overflow

请注意,%X是特定于unsigned int类型的较大或较小类型,您需要另一个说明符。我强烈建议使用<stdint.h><inttypes.h>这样的:

#include <stdio.h> // printf, snprintf 
#include <stdint.h> // intX_t 
#include <inttypes.h> // PRIx.. 

int main(void) { 
    int32_t i = 255; // signed 32 bit integer 
    char theIntegerAsString[5] = {0}; 

    if (snprintf(theIntegerAsString, sizeof(theIntegerAsString), "%" PRIX32, i) > 0) { 
     printf("The number %" PRId32 " in Hexadecimal is: %s\n", i, theIntegerAsString); 
    } 
}