2017-09-15 113 views
2

我熟悉C中的sizeof操作,但是當我將它用於字符串"1234abcd"時,它只返回4,我假設它是會計最後4個字符。 那麼我怎麼會得到這是一個字符串大小爲8?如何獲得c中的字符串的長度,如果它有整數

具體代碼如下:

FILE *in_file; 
in_file = fopen(filename, "r");  
if (in_file == NULL) { 
    printf("File does not exist\n"); 
    return 1; 
} 

int val_to_inspect = 0; 

fscanf(in_file, "%x", &val_to_inspect); 

while (val_to_inspect != 0) { 
    printf("%x", val_to_inspect); 
    int length = sizeof val_to_inspect; 
    printf("%d", length); 

同樣,正從文件中讀取的字符串是"1234abcd",只是爲了闡明。

+4

'sizeof'會給你一個數據類型的大小。看看'strlen()'。 – babon

+1

'int len1 = 0,len2 = 0; fscanf(in_file,「%n%x%n」,&len1,&val_to_inspect,&len2); int length = len2-len1;' – BLUEPIXY

回答

2

TL; DR,得到一個字符串的長度,你需要使用strlen()

也就是說,在使用sizeof時要謹慎一點,它對數據類型進行操作。所以,如果你傳遞一個指針,它會返回指針變量的大小,而不是它指向的字符串的長度。

4

是有幾個問題在這裏:

sizeof運算符返回對象的大小。在這種情況下,它返回的尺寸爲val_to_inspect,這是一個inthttp://en.cppreference.com/w/cpp/language/sizeof

fscanf從流中讀取並解釋它。您只掃描一個整數(「%x」),而不是一個字符串。 http://en.cppreference.com/w/cpp/io/c/fscanf

最後,如果你實際上有一個零終止的字符串,要得到它的長度,你可以使用strlen()

+0

更準確地說,要得到一個以null結尾的字符串的長度,不僅可以使用strlen ()',***應該這樣做。應用於'char *'或'char'數組的'sizeof'運算符會計算出不同的結果(並且在這兩種情況下有所不同)。 –

+0

從來沒有聲稱sizeof是在任何可能的工具工具:) – ssteinberg

+0

不,我提到'sizeof'因爲OP正在使用它。我的評論是關於你選擇的措辭;我澄清了這一點。 –

1

在幾個重要的方面,其中只有一些與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.herrno.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開口支架。

+0

我會說:*您的計算機上的int的大小是4 **字節** ... * – chqrlie

+0

@chqrlie _byte_的大小不一定與_ _char'_大小相同。 'sizeof'是以'char'單位定義的。 (是的,這是非常迂腐的,但我已經在這個網站上大吼大叫,因爲這個區別,所以。) – zwol

+0

恐怕你是不正確的。 C和C++中的「char」類型是定義中最小的可尋址單元,其大小爲1.它恰好是一個字節。相反,字節不一定有8位,舊系統有9位字節,某些DSP處理器有16位甚至32位字節。我堅持使用* byte *這個詞的原因是因爲'char'類型附加了特定的語義,比如潛在的簽名,當對對象的大小進行描述時,這是不相關的。 OTOH Java中的char類型是16位,在大多數系統上需要2個字節。 – chqrlie

0

最好是通過逐個字符地讀取字符來創建自己的計數器來查找"1234abcd"的長度。

FILE *in_file; 
char ch; 
int length=0; 

in_file = fopen("filename.txt", "r"); 
if (in_file == NULL) 
{ 
    printf("File does not exist\n"); 
    return 1; 
} 
while (1) { 
    ch = fgetc(in_file); 
    printf("%c", ch); 
    if (ch == EOF) 
     break; 
    length++; 
} 
fclose(in_file); 
printf ("\n%d",length); 
0

大家好,謝謝大家的反饋。我意識到我在原文中犯了很多錯誤,但是我只是從C++切換到c,所以很多我以前不能真正以同樣的方式應用的東西。這非常有幫助,有一個地方可以去。

0

長度=的sizeof(你的字符串)/的sizeof(char)的-1 -1 是EOF字符空 如果你想獲得任何來自特定begining指數長度只是做萊恩指數

相關問題