在几个重要的方面,其中只有一些与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
的文件,它确实会从该文件读取八个字符,但对于其他文件内容,它可能会读取更多或更少的字符。
(从技术上说,你应该使用无符号 INT,但大多数实现将让你用一个符号整数脱身%x
转换说明。)
(当你用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 char
s,而且无论的值是多少,都是如此。
此外,sizeof
应用于实际C字符串(即,一个char *
变量指向字符的NUL封端的序列)不不计算串的长度。它会将指针的大小告诉给字符串,该字符串将是一个常量(通常为4或8,取决于计算机),与字符串的长度无关。要计算字符串的长度,请使用库函数strlen
(在string.h
中声明)。
有时您会看到巧妙的代码将sizeof
应用于字符串文字,该函数的返回值与其长度有关(但不等于!)。为你锻炼:找出这个数字是什么,以及为什么sizeof
这样做是为了字符串文字,而不是为了一般的字符串。 (提示:sizeof s
将返回相关的s
字符串长度数字时s
被宣布为char s[] = "string";
,但不当它被宣布为char *s = "string";
。)
最后一点,它不会在这个问题上无论你是否喜欢你自己的系列中的开口花括号,但是选择一种风格并坚持贯穿整个文件。不要在if
行的末尾放置一些if
开口支架。
'sizeof'会给你一个数据类型的大小。看看'strlen()'。 – babon
'int len1 = 0,len2 = 0; fscanf(in_file,“%n%x%n”,&len1,&val_to_inspect,&len2); int length = len2-len1;' – BLUEPIXY