C - 我的程序从文件读取后打印奇怪的东西

标签 c string printf fopen

我正在尝试编写一个程序来读取 ID3 标签。到目前为止我没有太多代码,因为我正在尝试学习如何使用 ID3 标签本身。我制作了一个小程序,它会读取前三个字母并将它们打印回来,只是为了看看打开文件和关闭文件的过程如何工作,等等。

这是我的代码:

#include <stdio.h>

int main(int argc, char *argv[]) {

  char buf[4];

  if (argc == 2) {
    FILE *mp3 = fopen(argv[1], "r");

    fread(buf, 3, 1, mp3);
    buf[3] = "\0";
    printf("%s\n", buf);
    fclose(mp3);
    char a = buf[0];
    char b = buf[1];
    char c = buf[2];
    printf("%x\t%x\t%x\n", a, b, c);
  }
  return 0;
}

它成功地打印了它应该打印的内容(ID3),但随后它在 ID3 部分后面出现了一些奇怪的字母。我还添加了一个部分来打印这些值的十六进制值。

我是 C 语言新手,我发现这很难理解。另外,我不太明白制作和管理字符串的所有不同方法之间的差异。因此,我将非常感谢任何有关此问题的帮助以及如何使其变得更好并向我解释原因等。

最佳答案

将“\0”分配给 buf[3] 的部分是错误的。您应该使用单引号:

buf[3] = '\0';

原因是双引号表示字符串文字(这是一个以 null 结尾的 char 数组),而不是 char 变量。

关于C - 我的程序从文件读取后打印奇怪的东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18685738/

相关文章:

c - 在 printf 中显示字符串而不是数字 (C)

c - 用C实时写入文件

c++ - strftime 性能与 snprintf

c - 使用三个数字查找整数的总数组合

c++ - 如何在编译时输出结构中成员的偏移量(C/C++)

c - libusb_get_device_descriptor() 始终返回 0。如何检测故障?

java - 用Java解析文本文件

c# - 替换字符串C#中的值不起作用

c - 将 __VA_ARGS 用于 printf

C: 使用 stdarg.h 的可变参数列表