【问题标题】:C - my program prints weird stuff after reading from a fileC - 我的程序从文件读取后打印出奇怪的东西
【发布时间】:2013-09-08 16:03:47
【问题描述】:

我正在尝试编写一个程序来读取 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 的新手,我觉得这很难理解。另外,我不太了解制作和管理字符串的所有不同方式之间的区别。因此,我将不胜感激任何有关这方面的帮助以及如何使其变得更好并向我解释原因等。

【问题讨论】:

  • 我觉得应该是buf[3] = '\0'。单引号表示字符,双引号表示字符串。
  • 感谢您的回答!你和楼下那个人说的一样。对我来说,这是一个愚蠢的新手错误。谢谢:)

标签: c string printf fopen


【解决方案1】:

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

buf[3] = '\0';

原因是双引号表示字符串字面量(它是一个以空字符结尾的 char 数组)而不是 char 变量。

【讨论】:

  • C 中的字符串只是一个以 NULL 字符结尾的 char 变量数组。许多字符串函数从一开始就处理输入字符串并继续处理,直到找到这个 NULL 终止符。如果你无法确保你的字符串以 NULL 结尾(如前一种情况),该函数将继续向输出发送字符,直到找到 NULL。这将产生不可预知的结果。
  • 成功了。正如我所想,这是我犯的一个菜鸟错误。不管怎样,谢谢!我非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
相关资源
最近更新 更多