2014-01-26 61 views
3

我想在if-else內部給char數組的大小,這取決於文件中的行數。但是,當我嘗試以後使用它,它給了錯誤:「未申報陣」一if塊中聲明將成爲區塊內本地爲什麼我不能在IF-Else中聲明char數組?

FILE *f=fopen("G:\\workspaceC\\small1.txt","r"); 

while((c=fgetc(f))!=EOF) 
{ 
    if(c=='\n') 
     no_of_lines++; 
} 
printf("no_of_lines: %d",no_of_lines); 
int fclose(FILE *f); 

if(no_of_lines<10){ 
    char b[30]; 
} 
else if(no_of_lines>10 && no_of_lines<15){ 
    char b[60]; 
} 
else{ 
    char b[106]; 
} 

for(z=0;z<size;z++) 
    { 
     if(c==b[z]) ///////Here it gives error: "b undeclared" 
     { 
      flag=1; 
      break; 
     } 
    } 
+2

你可以 - 你展示瞭如何。麻煩的是數組的作用域是你聲明它的塊。你不能訪問這些塊以外的變量。此外,請注意,您聲明'fclose()' - 並且您不應該這樣做,因爲'#include '會這樣做 - 而不是調用它來關閉文件。 –

+0

'int fclose(FILE * f);' - >'fclose(f);' – BLUEPIXY

+0

順便提一下,您可以計算行數,然後根據行數分配更多或更少的字節,而不是行數是。你可能需要仔細考慮你所要做的。 –

回答

2

陣列。以技術術語來說,其範圍僅限於if塊。這就是你得到錯誤的原因。將該聲明移到塊之外。

還有更多的問題,但:

  1. 您先閱讀整個文件來決定的行數,扔掉所有你讀取數據。
  2. 你在哪裏初始化數組內容?因爲這個,你最終會遇到問題。

因此更好的方法是使用文件API先找到文件大小,爲此動態分配空間,將內容讀入動態分配的空間並適當地處理數據。

+0

爲了補充說明,OP可能需要VLA,動態分配,或者更好 - 只需聲明最大可能大小的數組。 106字節沒有任何意義。 – 2014-01-26 07:17:02

+0

但是,我將如何分配大小? – user3213918

+0

@ user3213918:爲什麼要麻煩?你的機器有多少內存?超過一兆字節,我敢打賭(可能是4-16 GiB)。因此,爲'b'分配4096字節確實不會對您的機器造成太大的影響。不要煩惱那些愚蠢的東西。如果你必須爲此煩惱,那麼有條件地選擇一個大小('int size;'),然後'int b [size];'是一個VLA - 可變長度數組。當然,這假定你的編譯器不超過15年過期(C99需要VLA支持)。如果你陷入了25年的時間扭曲(C89),那麼你就沒有VLA,而需要使用'malloc()'和'free()'代替。 –

1

---->IF-ELSE語句中,分配內存而不是聲明數組。

  1. 的char *改編
  2. malloc((sizeof(char)*30/60/106)
2

聲明該陣列bif塊。所以,它只對if塊可見。並且,在if區塊外部無法看到它。

如果您更改了以下代碼,您將達到您想要的效果。

int size; 
if(no_of_lines<10){ 
    size = 30; 
} 
else if(no_of_lines>10 && no_of_lines<15){ 
    size = 60; 
} 
else{ 
    size = 106; 
} 
char b[size]; 
+0

它工作完美。錯過了邏輯:) 非常感謝 – user3213918

+0

@ user3213918這是非常糟糕的解決方案!根據標準,它不應該工作(是的,我知道它實際上在gcc中有效,但並不意味着它可以在任何環境中工作)。數組必須用常量(值或常量變量)初始化! –

0

你在塊代碼{}中聲明你的數組。無論此塊是否在if語句中,只能在此塊中訪問此數組。

如果要動態更改數組大小,請在函數開頭的指針處聲明,然後爲其動態分配內存(例如,使用malloc)。然而,看起來在你的情況下,你可以在數組上聲明,並給它最大的大小,你將需要。

相關問題