如何在c中的字符串中存储数字

时间:2018-04-27 21:54:18

标签: c

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

3 个答案:

答案 0 :(得分:3)

你不需要[^ ]*来获取那么少的记忆,malloc会 在这种情况下也可以完成这项工作。还要记住你shouldn't cast mallocchar 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()函数可能无法正常工作,因为此函数不是标准函数。