【问题标题】:Equivalent of write in printf in the following code?相当于在下面的代码中写入 printf?
【发布时间】:2015-01-29 21:05:24
【问题描述】:

我想问一下这个 write 语句在 printf 语句中的等价物是什么?

write(STDOUT_FILENO, buf + start, end - start);

其中 buf 是 char*,start 是 int,end 是 int。 让我困惑的那一行是 buf + start? 或者我如何使用 strcpy 将其保存到 char 数组中,然后 printf 那个 char 数组。但我不知道如何将上述代码的输出复制到 char 数组。我无法理解 buf+start 行在做什么。

谢谢

【问题讨论】:

  • 你想做什么?
  • 我想将上面一行的输出保存到一个字符数组中以便我可以使用它。
  • 这是简单的指针运算。你在找memcpy吗?

标签: c file-io printf


【解决方案1】:

要复制您需要的数据

char *mybuffer;
mybuffer = malloc(end - start + 1);
if (mybuffer != NULL)
{
    memcpy(mybuffer, buf + start, end - start);
    mybuffer[end - start] = '\0';
}

好了,现在mybuffer 可以在printf 之类的函数中使用,您需要记住在使用mybuffer 之后的某个时间点执行free(mybuffer)。您还需要检查end - start >= 0 并注意如果数据中嵌入了null 字节,则对于printf 和家庭护理,字符串将比end - start 短。

【讨论】:

  • 感谢您的回答。 :) 我试图用 strcpy 做到这一点,但无法做到。 :)
  • 如果我想从函数中返回这个 mybuffer,那么我应该在哪里释放它?因为我无法在我必须返回这个 mybuffer 的函数中释放它? @iharob
  • 例如我从函数 A 返回这个 myBuffer。并在另一个函数 B 中将其作为 char * line = A();现在如果在使用 char * 行之后在函数 B 中,我会做 free(line) 它实际上会释放 myBuffer 吗?
  • 是的,free 表示将资源释放给操作系统,而不是清除内存或擦除它。
  • 感谢您的帮助:)
【解决方案2】:

表达式buf + start使用指针算法,相当于&buf[start],指向buf中位置start的指针。您显示的代码打印您的字符缓冲区buf 的从startend(排他性)的切片。

如果您的缓冲区不包含零,您可以将其重写为:

printf("%.*s", (int) (end - start), buf + start);

在您的情况下,强制转换为(int) 并不是绝对必要的,但printf 中的* 精度需要int 并且经常使用size_t 作为位置,所以我做了一个习惯。

【讨论】:

  • 很高兴提到“如果您的缓冲区不包含零”。
  • 感谢您的回答。缓冲区不包含零是怎么回事?
  • 缓冲区包含零,你的意思是? printf 格式 %s 用于打印以空字符结尾的字符串,即字节值为零。如果在格式中设置精度p,最多会打印p 个字符,但遇到空字符时会停止打印。简而言之:printf("%.6s", "Hi") 会打印“Hi”,printf("%.6s", "Good morning") 只会打印“Good m”。
  • 您应该提到str* 函数需要null 终止字符串,而缺少'\0' 终止字节才是真正导致问题的原因。
  • @iharob:具有精度的字符串格式不一定需要以空字符结尾的字符串。实际上,它旨在打印由长度分隔的字符串。不过,您仍然必须检查您的缓冲区是否包含可打印的字符。
猜你喜欢
  • 2015-11-14
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
  • 2011-10-03
  • 2015-01-19
  • 2014-02-02
  • 2014-04-05
相关资源
最近更新 更多