在幾個重要的方面,其中只有一些與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