fprintf正在打印两个值而不是一个

时间:2018-03-31 12:38:34

标签: c file hex printf

我使用fprintf来将值打印到文件中。这是一个简化的代码片段。在这里,我希望文件包含单个值0x0A。

int main() {
    FILE *fp;
    unsigned int hex[] = { 10 }; // Value to be written (10 = 0x0A)

    fp = fopen("file.txt", "w"); // Open
    fprintf(fp, "%s", hex); // Write
    fclose(fp); // Close

    return 0;
}

该文件如下所示(在十六进制编辑器中查看): enter image description here

它包含值0x0D和0x0A,但我预计只有0x0A。 将hex中的值设置为0x0A而不是10会产生相同的结果。

作为参考,这些是将hex中的值分别设置为11和12的结果: enter image description here enter image description here

这是正确的。

这里到底发生了什么?这个0x0D来自哪里?

1 个答案:

答案 0 :(得分:1)

抱歉,你没有指定你使用的操作系统/编译器,但我猜它是Windows(或不是unix / linux),因为它在printf(3)输出转换{{ 1}} char(\n)加入 CRLF seq 0x0a\r\n)如果是这样,你不想要要完成的翻译,只需将修饰符0x0d 0x0a添加到打开模式即可显示为b,以便不进行翻译。

"wb"

如果您将程序移动到unix机器上,那么没有问题,因为这些修改器包含在POSIX中。

注释

您的代码中存在错误,因为您使用fp = fopen("file.txt", "wb"); // Open (for writing in binary mode) 修饰符将无符号整数数组传递给printf,并且这是不正确的。 %s格式序列允许您只传递指向空终止字符串的char的指针(您的指针很幸运,但是您的代码遇到了未定义的行为)有效应该是:

%s

char hex[] = { 10, 0 }; // decimal char literals.

char hex[] = "\012"; // octal char.  No provision for decimal char literals.