c - C 中的 write() 函数有问题

标签 c pointers

鉴于我的部分代码:

char bmpheader[54] = {0x42, 0x4D, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x13, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

char bmpimagedata[36] = {0x07, 0x07, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0x07, 0x07, 0x07, 0x07, 0x07, 0x66, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0xFF, 0xFF, 0xFF, 0x46, 0x00, 0x00};


while (i < 54) {
    printf("%c", bmpheader[i]);
    write (socket, bmpheader[i], 1);
    i++;
}
while (j < 36) {
    printf("%c", bmpimagedata[j]);
    write (socket, bmpimagedata[j], 1);
    j++;
}

我的编译器出现错误,说传递 'write' 的参数 2 使两个写函数的指针都没有转换。我不太确定函数的参数本身(第三个参数是否正确?)。

我该如何纠正它?

最佳答案

标准write函数接受一个指向你想要写出的内容的指针;你正在向它传递一个 char(它被提升为一个 int)。

最小的修复是改变这个:

write (socket, bmpheader[i], 1);

write (socket, &bmpheader[i], 1);

...但还有更好的方法。

你可以让 write 自己写出所有 54 个字节:

write (socket, bmpheader, 54);

或者如果你真的想一次做一个char,你可以使用一个指针:

int i;
char *p;
for (i = 0, p = bmpheader; i < 54; ++i, ++p) {
    printf("%c", *p);
    write (socket, p, 1);
}

在任何一种情况下,您都希望避免使用魔数(Magic Number) 54 并从数据中获取它。因为 sizeof(char)always one byte in standard C ,您可以使用 sizeof 而无需执行丑陋的 sizeof(array)/sizeof(array[0]) 事情:

int i;
char *p;
for (i = 0, p = bmpheader; i < sizeof(bmpheader); ++i, ++p) {
    printf("%c", *p);
    write (socket, p, 1);
}

...但我确信有比这更优雅的解决方案。

您还可以使用 putchar(相当轻量级)代替 printf(相当重量级):

int i;
char* p;
for (i = 0, p = bmpheader; i < sizeof(bmpheader); ++i, ++p) {
    putchar(*p);
    write (socket, p, 1);
}

我曾经用指针运算来做这样的事情,不知道它们在现代世界中是否是不好的做法:

char* p;
char* endp;
for (p = bmpheader, p = bmpheader + sizeof(bmpheader); p < endp; ++p) {
    putchar(*p);
    write (socket, p, 1);
}

关于c - C 中的 write() 函数有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5663073/

相关文章:

C - argv[] 传入 * 作为参数,打印时返回 1

c - isspace() 不会计算 C 中的空格

iphone - uint32_t 数组的 NSLog 内容

c - 通过指针访问结构

c++ - OpenCV Tracker 属性访问在 ARM 上使用 SEGFAULT 失败,但在 X86_64 中有效

c++ - 使用迭代器在 vector 中插入下一个值以进行映射

c++ - 将 argv 类型转换为结构类型

c - 寻找匹配的 '` ' 时出现意外的 EOF,但仅当从 makefile 运行时?

c++ - 这是类型转换还是某种指针算法?

c - 在 C 中使用指针的 Scanf