【问题标题】:C - Concatenate char arrays, then write to stdout different to writing single charsC - 连接字符数组,然后写入标准输出,不同于写入单个字符
【发布时间】:2017-05-10 19:25:44
【问题描述】:

所以我的任务是在 C 中创建曼德尔分形。 我将保持代码简单,因为它非常简单。 问题:

  • 在给定的文件中,每个像素(char[3])单独计算,然后通过write(1, pixeldata, 3)写入stdout

  • 现在:由于这不是很有效,我想首先收集 char 数组中一行的所有像素 char line[width*3]

  • 一切正常,除了输出与之前的输出有很大不同(颜色看起来偏移等)

代码如下:

char pixelData[3];
char line[width*3];
for (y=1; y <= height; ++y) {
...
    for (x=1; x <= width; ++x) {
    ... calculate ...

    // iterate
        for ( .... calculate ...) {
               ... calculate ....
        }
        strncat(line, pixelData, 3);        // after
        // write(1, pixelData, 3);  // before: worked
}
write(1, line, sizeof(line)); // after
memset(line, 0, sizeof(line));

}

如果有人能告诉我,我在这里做错了什么,那就太酷了…… 在此先感谢:)

【问题讨论】:

  • 使用memcpy 而不是strncpy 像素数据之间可能有0
  • 听起来像是一个想法,但我使用 strcat/strncat 连接值(行 + newPixelData),我不知道与 memcpy 等效的东西
  • 谢谢,使用 memcpy 和指向数组中新索引的指针起作用了

标签: c arrays char mandelbrot


【解决方案1】:

您不能将字符串函数用于可能包含 0 的 char 数组,也不能用于不以 0 结尾的 char 数组。我相信您代码中的 pixelData 只是三个小整数的数组,而不是可打印的字符串。所以strncat 帮不了你。另一方面,由于您始终知道您的线路有多长,因此您不需要strncat 为您计算。

【讨论】:

  • 你是对的,pixelData 包含三个 RGB 值。因为我想先生成一整行(因此将这三个值附加到现有行),在我将其写入标准输出之前很长时间(宽度 * 3),我该怎么做呢?
  • @iwilltry:把它想象成一个三元组数组。第一个三元组占据位置 0-2;下一个3-5;然后4-6;等等。 (或者你可以使用二维数组。)你可能想看看memcpy
  • 谢谢,我是这样解决的:使用 int 作为 line[]-array 中当前位置的运行索引,而不是 memcpy(&line[i*3], pixelData, 3 );并增加 i。非常感谢您为我指明正确的方向:)
猜你喜欢
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-02
  • 2010-09-27
  • 2023-03-23
相关资源
最近更新 更多