2012-02-05 56 views
1

我必須爲我的C編程類編寫一個程序,它需要一個文本文件概述Letter頻率,然後使用該信息來接受另一個文本文件輸入使用該字母頻率對其進行加密和解密。起初,我並不真正懂得如何開始......所以我決定開始將我所有的想法都投入到一個主要功能中,並試圖從那裏開始工作,但我覺得我正在這樣做這樣一個複雜的方式,現在我只是想測試一下,看看是否使用了結構的概念,通過在屏幕上輸出一系列結構與我的所有信息,但我得到一個錯誤:Line 43 - >下標值既不是數組也不是指針。C - 凱撒密碼程序 - 下標值既不是數組也不是指針

我從來沒有見過這樣的錯誤,我不確定它是什麼意思...我希望我能告訴你我到目前爲止,也許有人可以向我解釋這個錯誤,並給我關於如何着手編寫這些代碼的一些建議(請教建議和解釋,因爲我知道這些材料是有害的^ _ ^)。

這裏是我的代碼:

struct keyFreq 
{ 
    char letter; 
    float freq; 
}; 

int main() 
{ 
    FILE *fin; 
    char freqname[20]; 
    char derp; 
    char temp[6]; 
    int spacecounter = 0; 
    printf("What is the name of the frequency file? "); 
    scanf("%s", freqname); 
    fin = fopen(freqname, "r"); 
    struct keyFreq k[25]; 
    while(!feof(fin)) { 
     fscanf(fin, "%c", &derp); 
     int i; 
     for(i = 0; i < 26; ++i) { 
      if((isalpha(derp)) && k[i].letter == NULL) { 
       k[i].letter = derp; 
       break; 
      } 
      if((isadigit(derp)) || derp == '.') { 
       int j; 
       for(j = 0; j < 7; ++j) { 
        if(temp[j] == -1) 
         temp[j] = derp; 
       } 
       break; 
      } 
      if((isspace(derp)) && (k[i].freq == '\0') && (spacecounter >= 2)) { 
       double now; 
       int k; 
       now = atof(temp); 
       for(k = 0; k < 7; ++k) 
        temp[k] = -1; 
       k[i].freq = now; //Problematic Line <-- 
       spacecounter = 0; 
       break; 
      } 
      if((isspace(derp)) && spacecounter < 2) 
       spacecounter = spacecounter + 1; 
      } 
     } 
     return 0; 
} 
+2

k在此塊中聲明爲int - 這會覆蓋較早的數組定義 – 2012-02-05 22:16:29

+1

如果您知道哪一行是第43行(包含錯誤的那一行),將會有所幫助 – Veger 2012-02-05 22:18:02

+0

http://stackoverflow.com/questions/5431941/in-c-is-while-feof-always-wrong – 2012-02-05 22:22:41

回答

3
  int k; 
      now = atof(temp); 
      for(k = 0; k < 7; ++k) 
       temp[k] = -1; 
      k[i].freq = now; //Problematic Line <-- 

k此代碼段中的第一行是重新聲明:int k;

它陰影您k對象的初始聲明:struct keyFreq k[25];。要解決這個問題,請在兩個變量聲明中使用兩個不同的名稱。

+0

噢,多麼愚蠢的錯誤TT謝謝您指出:/ – RedMageKnight 2012-02-05 22:29:00

1
struct keyFreq k[25]; 
       int k; 
       now = atof(temp); 
       for(k = 0; k < 7; ++k) 
        temp[k] = -1; 
       k[i].freq = now; //Problematic Line <-- 

最後k不是數組,它是您剛纔定義4行的int
int類型的對象不能用作數組。

我看到你正在使用C99(//註釋,定義和代碼中的),所以儘量限制臨時k的定義for循環

struct keyFreq k[25]; 
       now = atof(temp); 
       for(int k = 0; k < 7; ++k) 
        temp[k] = -1; 
       k[i].freq = now; //Problematic Line <-- 
+0

關於c99的評論,很多c89編譯器在'for'循環的第一個子句中不支持聲明的情況下,支持''樣式註釋(作爲默認擴展)。 – ouah 2012-02-05 22:27:09

+0

我會問(我對Java更熟悉),我可以在C語言中的for循環中聲明int k,就像在Java中一樣嗎?我的教授總是早先宣佈它,所以我認爲它在C環境中不被支持。 – RedMageKnight 2012-02-05 22:34:52

+0

1999版本的語言中引入了'for'循環中的聲明,其範圍僅限於循環體。尚未採用該修訂版的編譯器不接受該構造(除非它們具有擴展名)。我不知道MSVC是否接受它---我認爲MSVC不是C99編譯器。 gcc接受1999年版本的大部分語言。 – pmg 2012-02-05 23:12:25

0

問題是這樣的:

int k; 

埋着

struct keyFreq k[25]; 

變化int k;早期定義別的東西,或重命名您的原始數組。

一般來說,對不是迭代器的變量使用單字母變量名是不好的做法。否則像這樣的事情可能會發生(並且代碼難以閱讀)。

相關問題