我是C的新手,我正在尝试将Integer存储在一个字符串中。任何人都可以点亮我是如何做到的。
我的代码:
char *str = (char *)malloc(5 * sizeof(char));
str[0] = 'h';
sprintf(&str[1], "%d", 34);
str[2] = 'e';
expected output: h34e
output: h3e
答案 0 :(得分:3)
你不需要[^ ]*
来获取那么少的记忆,malloc
会
在这种情况下也可以完成这项工作。还要记住你shouldn't cast malloc
。 char str[5]
总是1,
所以你也可以省略它。您还应该始终检查返回值
sizeof(char)
:
malloc
不要忘记释放记忆。
但我现在离题了。代码问题中的问题是
char *str = malloc(5);
if(str == NULL)
{
// error handling
}
正在覆盖str[2] = 'e';
中的4。这就是输出为"h34"
的原因。之后
h3e
调用内存如下:
sprintf
正确的索引是index 0 1 2 3 4
+-----+-----+-----+------+-----+
| 'h' | '3' | '4' | '\0' | ??? |
+-----+-----+-----+------+-----+
,而不是2:
3
如果你追加一个角色,你一定不要忘记设置
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
但我也喜欢你的原始代码,因为它会迫使你思考如何访问 带索引的数组元素以及字符串如何存储在内存中。作为一项练习,这很好。对于更严肃的项目,我不会以这种方式创建字符串。我使用单线解决方案。
答案 1 :(得分:2)
您可以使用int snprintf(char *str, size_t size, const char *format, ...)
在一行中执行此操作:
snprintf(str, 5, "h%de", 34);
snprintf
将使用\0
终止您的字符串。
答案 2 :(得分:1)
您可以使用 itoa()功能。 C语言中的此函数将int数据类型转换为字符串数据类型(Null终止字符串)。该函数的语法如下所示。
formidtxt
第三个参数base指定转换基数。例如: - 如果base为2,则它将整数转换为其二进制兼容字符串,或者如果base为16,则它将创建整数的十六进制转换字符串形式。
注意:itoa()函数可能无法正常工作,因为此函数不是标准函数。