c - 如何在c中将数字存储在字符串中

标签 c

我是 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/

相关文章:

c - FIFO channel 读取不正确

C:从类型 char * 分配给类型 char[] 时类型不兼容

c - sscanf 可选格式说明符或参数

php - 你如何将 Rust 中的整数转换为 C 中的 char*

c++ - 是否可以在 linux 裸机服务器中使用 C/C++ GUI 应用程序?

c - 如何将一个 TCP 服务器连接到另一个 TCP 服务器

c - 如何知道引用的 fp 当前正在写入哪个文件?

c - 如何增加指针地址和指针的值?

c - 程序查找文本中有多少个单词不包含特定字符

c - Mingw 使用 malloc 作为结构体