C - Caesar密码程序 - 下标值既不是数组也不是指针

时间:2012-02-05 22:14:32

标签: c

我必须为我的C编程类编写一个程序,该程序采用一个文本文件概述Letter Frequency,然后使用该信息获取另一个加密的文本文件输入并使用该字母频率对其进行解密。起初,我真的不知道如何开始...所以我决定开始将我的所有想法都投入到主要功能中,并试图让它从那里开始工作,但我觉得我在做这个这样一个错综复杂的方式现在我正处于我想测试的地步,看看是否通过在屏幕上输出我的所有信息的结构数组来使用结构的概念,但我收到一个错误:Line 43 - >下标值既不是数组也不是指针。

我以前从未见过这样的错误,我不确定它是什么意思...我希望我能告诉你到目前为止我所拥有的东西,也许有人可以向我解释这个错误并给我一些关于我应该如何着手编写这些代码的建议(建议和解释,因为我学习材料是有害的^ _ ^)。

这是我的代码:

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;
}

3 个答案:

答案 0 :(得分: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];。要解决此问题,请在两个变量声明中使用两个不同的名称。

答案 1 :(得分: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 <--

答案 2 :(得分:0)

问题在于:

 int k;

隐藏了

的早期定义
 struct keyFreq k[25];

int k;更改为其他内容,或重命名原始数组。

通常,对非迭代器的变量使用单字母变量名称并不是一种好习惯。否则可能会发生这样的事情(并且代码难以阅读)。