gpt4 book ai didi

c - 分配多少空间用于在字符串中打印 long int 值?

转载 作者:行者123 更新时间:2023-12-02 05:59:47 25 4
gpt4 key购买 nike

我想在动态分配的字符串中存储一个 long 值(LONG_MAX 在我的测试程序中),但我很困惑我需要分配多少内存才能显示在字符串。

我的拳头尝试:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>

int main(void)
{
char *format = "Room %lu somedata\n";
char *description = malloc(sizeof(char) * strlen(format) + 1);

sprintf(description, format, LONG_MAX);

puts(description);

return 0;
}

编译为

gcc test.c

然后运行它(并将其通过管道传输到 hexdump):

./a.out | hd 

返回

00000000  52 6f 6f 6d 20 39 32 32  33 33 37 32 30 33 36 38  |Room 92233720368|
00000010 35 34 37 37 35 38 30 37 20 62 6c 61 62 6c 61 0a |54775807 blabla.|
00000020 0a |.|
00000021

查看输出,似乎我对 sizeof(char) * strlen(format) + 1 的内存分配是错误的(分配的内存太少)并且更意外地工作?

那么分配的正确金额是多少?

我的下一个想法是(伪代码):

sizeof(char) * strlen(format) + strlen(LONG_MAX) + 1

这看起来太复杂了,而且非常不合逻辑。还是我做错了什么?

最佳答案

你做的完全错了。 LONG_MAX是一个整数,所以不能调用strlen()。给出最长结果的不是数字,而是 LONG_MIN。因为它也打印一个减号字符。

一个不错的方法是写一个函数

char* mallocprintf (...)

它具有与 printf 相同的参数,并返回使用 malloc 分配的具有完全正确长度的字符串。如何做到这一点:首先弄清楚什么是 va_list 以及如何使用它。然后弄清楚如何使用 vsnprintf 找出 printf 的结果在没有实际打印的情况下会有多长时间。然后调用 malloc,并再次调用 vsnprintf 以生成字符串。

这有一个很大的优势,当您打印使用 %s 的字符串,或使用 %s 的具有一些大字段长度的字符串时,它会起作用。猜猜 %999999d 打印了多少个字符。

关于c - 分配多少空间用于在字符串中打印 long int 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30398185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com