2012-02-05 28 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;早期定义别的东西,或重命名您的原始数组。

一般来说,对不是迭代器的变量使用单字母变量名是不好的做法。否则像这样的事情可能会发生(并且代码难以阅读)。

相关问题