你能帮我解决C中的多个错误吗?

时间:2014-04-24 02:19:07

标签: c

我对C很陌生,我对一些不同的概念有困难,包括指针,数组和阅读文件。这是我开始制作的节目,我确定他们有一些错误,你能不能告诉我我做错了什么?该程序应该读取来自congress.txt的字母并将它们存储为没有空格的大写字母,我还尝试进行一些测试,它将为我打印字母,以便我可以看到数组存储中的字符是否正确。我听说我不应该在这里测试!= EOF,但我的老师已经使用过了,我不想简单地复制一些我不理解的东西。

这就是congress.txt:

国会不得制定任何关于宗教信仰或禁止自由行使的法律;或剥夺言论自由或新闻自由;或者人民和平集会的权利,以及请求政府纠正不满。

#include<stdio.h>

int processFile(int *store);
int cipher(int *store, int *code);

int main(void){
    int store[300], code[300], i;

    processFile(store);
    for (i = 0; store[i] != 0; ++i){    //does a print test of store so I can see      if the txt was stored properly
        printf("%c", store[i]);
    }
    getchar();
    return;
}

int processFile(int *store){
    int i, a = 0;
    FILE *f = fopen("congress.txt", "r");

    for (i = 0; a != EOF;){
        fscanf(f, "%c", &a);        //store character in a
        if (a <= 'Z' && a >= 'A'){  //store capital letters
            store[i] = a;
            i++;
        }
        if (a <= 'z' && a >= 'a'){  //store lower case letters as capital
            store[i] = a - 32;
            i++;
        }
    }
}

3 个答案:

答案 0 :(得分:2)

这一行:

fscanf(f, "%c", a);

应该是:

fscanf(f, "%c", &a);

答案 1 :(得分:1)

这个循环没有任何意义。

for (i = 0; b != NULL; i++)
    printf("%s", store[i]);
    b = store[i + 1];
}

store[i]int,因此您无法使用"%s"进行打印。我认为你的意思是printf("%c", store[i]);,这意味着打印字符代码是int的字符(这是正常的,因为你之前用scanf阅读了这一点。)

b != NULL应为b != 0,但这会在循环第一次测试b的未初始化值。试试这个:

for ( i = 0; store[i] != 0; ++i )
    printf("%c", store[i]);

在另一段代码中,659097122更明确地表达为'A''Z',分别为'a''z'

您可能需要考虑使用isupper中的islower<ctype.h>函数。 a - 32应替换为toupper(a);

答案 2 :(得分:1)

我会将您的processFile主体更改为:

int i, a = 0;
FILE *f = fopen("congress.txt", "r");

if(f) 
{
    for( i=0; i<300 && ((a=fgetc(f)) != EOF); i++)
    {
        if ( isupper(a) ){  //store capital letters
            store[i] = a;
        }
        else if ( islower(a) ){  //store lower case letters as capital
            store[i] = toupper(a);
        }
    }
    fclose(f);
}
if (i==300) i--;
store[i] = 0; // always put a zero after the last element 
              // since your loop in main depends on it to exit.

这可以解决EOF问题,并修复store数组的潜在溢出问题。 (您可能希望将商店的最大尺寸传递给例程而不是硬编码300 ...)