在几个重要的方面,只有其中一些与sizeof 有任何关系,你对你的代码实际上做了什么是错误的。
FILE *in_file;
in_file = fopen(filename, "r");
if (in_file == NULL)
{
printf("File does not exist\n");
return 1;
}
感谢实际检查fopen 是否成功;很多人在开始使用 C 语言时忘记这样做。但是,fopen 可能失败的原因有很多;不存在的文件只是其中之一。每当 I/O 操作失败时,请务必打印 strerror(errno),以便了解实际原因。此外,错误消息应发送至stderr,而不是stdout,并应包括受影响文件的名称(如果有)。更正后的代码看起来像
if (in_file == NULL)
{
fprintf(stderr, "Error opening %s: %s\n", filename, strerror(errno));
return 1;
}
(如果string.h 和errno.h 不存在,则需要将它们添加到文件顶部。)
int val_to_inspect = 0;
fscanf(in_file,"%x", &val_to_inspect);
这段代码不从文件中读取字符串。它跳过任何前导空格,然后从文件中读取一系列十六进制数字,一旦遇到非数字就停止,并立即将它们转换为存储在val_to_expect 中的机器编号。对于包含1234abcd 的文件,它确实会从文件中读取八个字符,但对于其他文件内容,它可能会读取更多或更少。
(从技术上讲,使用 %x 转换说明符,您应该使用 unsigned int,但大多数实现都会让您摆脱使用带符号的 int。)
(当您在 C 语言中进行更多练习时,您会发现 scanf 已被破坏,并且很难稳健地使用,但现在不用担心。)
while (val_to_inspect != 0) {
printf("%x", val_to_inspect);
int length = sizeof val_to_inspect;
printf("%d", length);
}
您没有将sizeof 应用于字符串,而是将其应用于int。在您的计算机上,int 的大小是 4 chars,这是真的无论值是多少。
此外,sizeof 应用于实际的 C 字符串(即,char * 变量指向以 NUL 结尾的字符序列)不计算字符串的长度。相反,它将告诉您 pointer 指向字符串的大小,该大小将是一个与字符串长度无关的常数(通常为 4 或 8,具体取决于计算机)。要计算字符串的长度,请使用库函数strlen(在string.h 中声明)。
您有时会看到巧妙的代码将sizeof 应用于字符串文字,它确实返回了一个与其长度相关(但不等于!)的数字。为您练习:弄清楚这个数字是多少,以及为什么sizeof 对字符串文字执行此操作,而不是对一般字符串执行此操作。 (提示:当s 被声明为char s[] = "string"; 时,sizeof s 将返回一个与s 的字符串长度相关的数字,但在声明为char *s = "string"; 时不会。)
最后一点,无论您是否喜欢将左大括号放在自己的行中,这在总体方案中并不重要,但选择一种风格并在整个文件中坚持下去。不要将一些 if 左大括号放在自己的行中,而将其他大括号放在 if 行的末尾。