我是 C 的新手,我正在尝试将整数存储在字符串中。任何人都可以说明我如何做到这一点。
我的代码:
char *str = (char *)malloc(5 * sizeof(char));
str[0] = 'h';
sprintf(&str[1], "%d", 34);
str[2] = 'e';
expected output: h34e
output: h3e
最佳答案
你不需要malloc
来获得那么小的内存,char str[5]
会
在这种情况下也可以完成工作。还要记住你shouldn't cast malloc
. sizeof(char)
始终为 1,
所以你也可以省略它。您还应该始终检查的返回值
malloc
:
char *str = malloc(5);
if(str == NULL)
{
// error handling
}
不要忘记释放内存。
但我现在离题了。您的代码问题中的问题是
str[2] = 'e';
正在覆盖 "h34"
中的 4。这就是输出为 h3e
的原因。之后
sprintf
调用内存如下所示:
index 0 1 2 3 4
+-----+-----+-----+------+-----+
| 'h' | '3' | '4' | '\0' | ??? |
+-----+-----+-----+------+-----+
正确的索引是3
,不是2:
char str[5];
str[0] = 'h';
sprintf(&str[1], "%d", 34);
str[3] = 'e';
str[4] = '\0'; // making sure to terminate string
puts(str); // output is h34e
如果追加一个字符,一定不要忘记设置
'\0'
- 终止字节。这就是我在 str[4] = '\0'
中所做的。在你的
例如,您很“幸运”,因为您没有覆盖 '\0'
-终止
字节,所以字符串仍然正确终止。
此外 snprintf
也采用长度,而不是您应该使用的长度
sprintf
。在这种情况下,您可以使用 sprintf
,因为您知道
缓冲区和数字的长度,你知道你不会写
超出限制,这就是为什么在这种情况下可以使用 sprintf
而不是
snprintf
.
当然你可以用两行代码来完成:
char str[5];
sprintf(str, "h%de", 34);
但我也喜欢你的原始代码,因为它迫使你思考如何访问 具有索引的数组元素以及字符串如何存储在内存中。作为练习,这是很好的。对于更严肃的项目,我不会以这种方式创建字符串。我会使用单行解决方案。
关于c - 如何在c中将数字存储在字符串中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50070765/