c语言文件题遇到问题,要求输入1/2/3,分别为三个任务,生成三种统计答案。问题在于others计数总是偏少。
然后我发现a用fgetc吸收不了空格,然后就漏了一个(第三行的那一个)。
希望能帮忙解决一下这个问题。可以让dict.dic输出和用例相符
如果dict.dic文件内容如下: (文件每行都有换行符,且前边无空格)
abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZ
~!@#$%^&*()_+`1234567890- =\][';/.,<>?":{}|
则三个任务的输出分别如下: (注意:Task1、2、3等也需要输出)
Task1:
capital: 26
lowercase: 26
digit: 10
others: 36
Task2:
line: 3
43 characters in max line.
26 characters in min line.
#include
#include
#include
int main()
{
FILE *fp=fopen("dict.dic","r");
char a;
int dic[130]={0};
int capital=0,lower=0,digit=0,others=0;
int max=-1,min=1e6,buf=0,cnt=0,flag=0;
int n;
scanf("%d",&n);
a=fgetc(fp);
while (a!=EOF)
{
cnt++;
while (a!='\n'&&a!=EOF)
{
if (a>='a'&&a<='z')
{
dic[a]++;
lower++;
}
else if(a>='A'&&a<='Z')
{
dic[a]++;
capital++;
}
else if(a>='0'&&a<='9')
{
digit++;
}
else{
if (a==' ')
printf("woshikongge");
others++;
}
buf++;
a=fgetc(fp);
printf("%c",a);
}
if (buf>max)
{
max=buf;
}
if (bufif (a=='\n')
{
others++;
a=fgetc(fp);
buf=0;
}
}
if (n==1)
{
printf("Task1:\ncapital: %d\nlowercase: %d\ndigit: %d\nothers: %d",capital,lower,digit,others+1);
}
else if (n==2)
printf("Task2:\nline: %d\n%d characters in max line.\n%d characters in min line.",cnt,max,min);
else if (n==3)
{
printf("Task3:\nCAPITAL:\n");
for (char i='a';i<='z';i++)
{
printf("%c:%d\n",i,dic[i]);
}
printf("LOWERCASE:\n");
for (char i='A';i<='Y';i++)
{
printf("%c:%d\n",i,dic[i]);
}
printf("%c:%d",'Z',dic['Z']);
}
fclose(fp);
return 0;
}
参考GPT和自己的思路:根据你的描述,问题出现在others计数总是偏少,主要原因是因为空格字符无法正确计数。你已经发现了问题在于a用fgetc吸收不了空格,然后就漏了一个(第三行的那一个)。解决这个问题的方法是使用fgets函数替代fgetc函数逐行读取文件内容,这样可以正确地处理空格字符。具体的代码改动如下:
将
a=fgetc(fp);
while (a!=EOF)
{
cnt++;
while (a!='\n'&&a!=EOF)
{
if (a>='a'&&a<='z')
{
dic[a]++;
lower++;
}
else if(a>='A'&&a<='Z')
{
dic[a]++;
capital++;
}
else if(a>='0'&&a<='9')
{
digit++;
}
else{
if (a==' ')
printf("woshikongge");
others++;
}
buf++;
a=fgetc(fp);
printf("%c",a);
}
if (buf>max)
{
max=buf;
}
if (buf<min)
{
min=buf;
}
if (a=='\n')
{
others++;
a=fgetc(fp);
buf=0;
}
}
修改为
char line[100];
while (fgets(line, sizeof(line), fp) != NULL)
{
cnt++;
int len = strlen(line);
if (line[len-1] == '\n')
{
line[len-1] = '\0';
len--;
}
if (len > max)
{
max = len;
}
if (len < min)
{
min = len;
}
for (int i = 0; i < len; i++)
{
char ch = line[i];
if (ch>='a'&&ch<='z')
{
dic[ch]++;
lower++;
}
else if(ch>='A'&&ch<='Z')
{
dic[ch]++;
capital++;
}
else if(ch>='0'&&ch<='9')
{
digit++;
}
else{
others++;
}
}
}
这样就可以正确计数空格字符了。