将整数值存储为C中的字符串

时间:2014-11-05 09:20:11

标签: c string pointers

以下代码打印整数值:

for ( i=0 ; i<COL ; i++ )
{           
    fprintf(iOutFile,"%02x ",(int)(iPtr[offset]));      
} 

我想将这些整数值存储为字符指针中的字符串。为此,我尝试了以下代码,但它不起作用。

    char *hexVal="";
    char *temp;
    int val;

    for ( i=0 ; i<COL ; i++ )
    {           
       fprintf(iOutFile,"%02x ",(int)(iPtr[offset]));
       val = (int)(iPtr[offset]);      
       temp=(char*) val;
       hexVal = strcat(hexVal,temp);      
    }
    printf("%s", hexVal);

感谢名单.......

3 个答案:

答案 0 :(得分:1)

由于hexVal处没有可写内存,因此只会指向包含值为0的字符的只读区域。

您将获得未定义的行为。它是一个有效的字符串,但它是常量且有长度0,你不能追加它。

此外,当然你不能将整数转换为“字符串”,这不是C的工作方式。这样:

temp=(char*) val;

简单地将val的值重新解释为指针(即作为地址),它不会神奇地计算用于表示地址的正确数字字符序列,即它不会转换{ {1}}到字符串。

您可以使用val将整数转换为字符串。

所以,总结一下:

  • snprintf()的声明更改为例如hexval,它将它声明为一个包含32个字符的数组,为您提供足够的空间来构建一个数字作为字符串。它初始化数组,因此第一个字符为0,从而使它成为一个空字符串(有空格来增长)。
  • 使用例如char hexval[32] = "";将数字格式化为十进制形式的字符串(应该是snprintf(tmp, sizeof tmp, "%d", 4711);)。
  • 使用char tmp[16];将新构建的数字字符串连接到strcat(hexval, tmp);
  • 你无法永久连接的
  • BEWARE 如果你做得太久就会耗尽空间。在这种情况下,调整尺寸。
  • 尽可能检查返回值,阅读手册页(Google hexval其中man FUNCTION是标准C库函数,如FUNCTION)。

答案 1 :(得分:1)

写作时

char* hexVal = "";

您正在将hexVal设置为指向字符串文字,稍后在您的代码中尝试strcat到该地址,这将导致未定义的行为。

你需要做的是分配一个足够大的区域来保存你得到的字符串,然后让hexVal指向它。

E.g。

char* hexVal = malloc(100); // or how much bytes you need

然后就这样做

strcat(hexVal, temp);

ALT。在堆栈上分配

char hexVal[100];

答案 2 :(得分:1)

你正在接近这个错误。一般来说,如果你有int i,那么你不能仅仅char *cpi的地址(或值)进行类型转换,并期望它能够神奇地成为一个字符串,你可以printf或在strcat中使用。首先,字符串是以空值终止的,并且没有固定的长度,而int的固定大小通常为32位长。

您必须创建一个单独的缓冲区(内存空间),snprintf将很乐意为您创建int值的字符串表示形式。

我认为你的问题更多的是关于理解编程,指针和C的工作方式,而不是关于int和字符串及其转换。