2014-09-03 35 views
1

我有一个数组(readingreg [4]),它用十六进制数字填充。我的目标是将数据类型转换为字符串。我看过一些建议,似乎sprintf是要走的路。sprintf没有给出预期值

这是我的尝试:

sprintf(server0, "0x%02X", readingreg[0]); 
printf("This is element 0: %s\n", server0); 

sprintf(server1, "0x%02X", readingreg[1]); 
printf("This is element 1: %s\n", server1); 

sprintf(server2, "0x%02X", readingreg[2]); 
printf("This is element 2: %s\n", server2); 

sprintf(server3, "0x%02X", readingreg[3]); 
printf("This is element 3: %s\n", server3); 


printf("This is element 0: %s\n", server0); 
printf("This is element 1: %s\n", server1); 
printf("This is element 2: %s\n", server2); 
printf("This is element 3: %s\n", server3); 

这里是我的输出:

This is element 0: 0x4A 
This is element 1: 0xAA 
This is element 2: 0xAA 
This is element 3: 0xA0 
This is element 0: 0 
This is element 1: A0 
This is element 2: xA0 
This is element 3: 0xA0 

在这一点上,我是在什么样的sprintf为我做了很困惑。我的预期输出是server0 - server4都保留其字符串值。任何想法为什么这是发生?

这里是程序的简化版本:

readingreg[0] = 4A; 
readingreg[1] = AA; 
readingreg[2] = AA; 
readingreg[3] = A0; 
char server0[1]; 
char server1[1]; 
char server2[1]; 
char server3[1]; 

完整的程序是超过1000行代码所以我提供应足以编译和运行。

+1

server0-3如何初始化?看起来像指向堆栈分配单个字符而不是缓冲区...? – 2014-09-03 20:45:00

+0

'serverx'变量声明是问题的关键。不要将它们排除在您发布的代码之外。事实上,发布一个完整的程序会如此困难,以至于我们所需要做的就是复制/粘贴到我们的代码编辑器中并运行它? – PaulMcKenzie 2014-09-03 20:47:05

+0

请发布一个[SSCCE](http://sscce.org),可以按原样进行复制/粘贴和编译。 – 2014-09-03 20:54:05

回答

1

当你这样做:

char server0[1]; 
sprintf(server0, "0x%02X", readingreg[0]); 

你正试图把5个字符(别忘了尾随 '\ 0')为1点的字符缓冲区。这导致发生在观测输出中的未定义行为。

你应该做的(至少)是使字符缓冲区足够大,可以存储任何你把它:

char server0[8]; 
sprintf(server0, "0x%02X", readingreg[0]); 

更好的解决方案是使阵列大使用snprintf()或类似的功能来确保您不会溢出字符缓冲区:

char server0[8]; 
snprintf (server0, sizeof(server0)/sizeof(server0[0]), "0x%02X", readingreg[0]); 
+0

如果仅使用'sprintf',不仅应该缓冲区“足够大”,但大于预期。太多的程序员偷工减料,并试图预测,直到确切的字节,他们的缓冲区有多大。这几乎总是导致内存覆盖。 – PaulMcKenzie 2014-09-03 21:25:15

+0

好吧我刚刚尝试过snprintf()并使用上面演示的语法。当我做%s的server0 [0]的printf时,控制台打印垃圾。我期待server0 [0] ='4'和server0 [1] ='A' – KS7X 2014-09-03 22:08:00

+0

不要做'printf(“%s”,server0 [0]);'因为这是UB。你想要做'printf(“%s”,server0);'。 – uesp 2014-09-04 00:52:47

相关问题