【问题标题】:Manually Incrementing Pointers手动递增指针
【发布时间】:2014-03-25 10:26:41
【问题描述】:

我正在使用 C 的 sprintf 函数写入指针。

我将空白字符(空格)、逗号和整数写入此指针。指针分配了 4096 字节。

我在写的时候手动增加指针,但是我在格式化时遇到了问题。

代码如下:

sprintf(result, "%d ", number);
memory += 3;

sprintf(result, "%d, ", number);
memory += 4;

输出: printf("%s", (char *)memory);

根据程序的情况,我执行以下操作之一。最初我分别使用了 2 和 3,但这导致我输出时的间距方式出现格式问题。我在网上查了一下,发现整数占用 2 个字节的内存,而 char 占用 1 个字节,因此我分别更改为 3 和 4。 (空格(1)+整数(2))= 3和(空格(1)+逗号(1)+整数(2))= 4。但是,当我使用这些时,我会丢失一些输出数据-它出现了缩短它。同样,我已经为指针分配了 4096 个字节,这应该足够正确输出了。

也许我不正确地递增指针或打印不正确?

【问题讨论】:

  • 也许是momory += sprintf(result+memory, out_format, number); ... printf("%s", result);
  • +1 因为您发布的内容与我刚刚接受的答案相同,只是稍晚一点

标签: c pointers memory-management increment


【解决方案1】:

您在此处所做的工作并不完全清楚,但我假设您正在尝试根据 sprintf 调用所占用的字符数来调整输出缓冲区中的写入指针。

sprintf 返回实际写入输出缓冲区的字符数,因此不要将指针增加猜测的字符数,而是使用返回值。

numWritten = sprintf(result, "%d ", number);
memory += numWritten;

我假设内存是一个 char*;如果它是指向其他类型的指针,您也会得到意想不到的结果,因为算术受到指针指向的内容的影响。

【讨论】:

  • 你的目标是正确的!对于清晰度问题,我很抱歉,但这正是我要问的,您提供了一个完美的解决方案!
【解决方案2】:

问题是您正在将整数转换为字符串。每个整数的数字将消耗一个字节(sizeof(char))。

int number = 1;
sprintf(result, "%d ", number);
>> "1 " -> two bytes
int number = 134;
sprintf(result, "%d ", number);
>> "134 " -> four bytes

要解决这个问题,您应该计算数字中的位数并将其添加到内存指针中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 2010-09-23
    • 2017-01-05
    • 1970-01-01
    • 2016-07-01
    相关资源
    最近更新 更多