我对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++;
}
}
}
答案 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]);
在另一段代码中,65
,90
,97
,122
更明确地表达为'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 ...)