以区分大小写的方式计算文件中字符出现的次数
Counting the number of occurrence of a character in a file in case-sensitive way
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main()
{
FILE *fp1;
char ch,f[100],c,d;
int ct=0;
printf("Enter the file name\n");
scanf("%s",f);
fp1=fopen(f,"r");
printf("Enter character:");
scanf(" %c",&c);
c=toupper(c);
do
{
ch=fgetc(fp1);
d=toupper(ch);
if(c==d||c==ch)
++ct;
} while(ch!=EOF);
fclose(fp1);
printf("\n");
printf("%d",ct);
return 0;
}
这里我的文件包含 aAaAaA
,当我执行这段代码时,我在文件中得到了 6 个字符,但我应该得到 3 个字符,因为 a 和 A 不区分大小写。这段代码有什么问题?
在您的代码中,本质上,您是在无条件地增加计数器。
if(c==d || c==ch)
^ ^
| |
UPPERCASE original
将为两个案例增加计数器。
正如目前编写的代码。对于 a
或 A
的输入,c
总是 A
,因此
- 当从文件中读取
a
时,d
为 A
,因此,c==d
为 TRUE,递增计数器
- 当从文件中读取
A
时,ch
是 A
,因此 d
从而 c==d
给出 TRUE,递增计数器。
您真正想要的是将输入视为 区分大小写 [A
和 a
应计为不同的字符。]
此外,正如 @coolguy 先生在他的评论中提到的,在使用 [=67= 之前检查 fopen()
的 return 值是否成功]ed指针。
解决方案:
- 不要使用
toupper()
转换输入。请改用实际输入。
- 如果要区分大小写,只检查用户输入和文件输入,不进行任何大小写转换。伪代码可能看起来像
.
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main(void)
{
FILE *fp1 = NULL;
char ch,f[100],c,d;
int ct=0;
printf("Enter the file name\n");
scanf("%s",f);
fp1=fopen(f,"r");
if (!fp)
{
printf("Cannot open file for reading\n");
exit(-1);
}
printf("Enter character:");
scanf(" %c",&c);
do
{
ch=fgetc(fp1);
if(ch == c)
++ct;
}while(ch!=EOF);
fclose(fp1);
printf("%d\n",ct);
return 0;
}
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main()
{
FILE *fp1;
char ch,f[100],c,d;
int ct=0;
printf("Enter the file name\n");
scanf("%s",f);
fp1=fopen(f,"r");
printf("Enter character:");
scanf(" %c",&c);
c=toupper(c);
do
{
ch=fgetc(fp1);
d=toupper(ch);
if(c==d||c==ch)
++ct;
} while(ch!=EOF);
fclose(fp1);
printf("\n");
printf("%d",ct);
return 0;
}
这里我的文件包含 aAaAaA
,当我执行这段代码时,我在文件中得到了 6 个字符,但我应该得到 3 个字符,因为 a 和 A 不区分大小写。这段代码有什么问题?
在您的代码中,本质上,您是在无条件地增加计数器。
if(c==d || c==ch)
^ ^
| |
UPPERCASE original
将为两个案例增加计数器。
正如目前编写的代码。对于 a
或 A
的输入,c
总是 A
,因此
- 当从文件中读取
a
时,d
为A
,因此,c==d
为 TRUE,递增计数器 - 当从文件中读取
A
时,ch
是A
,因此d
从而c==d
给出 TRUE,递增计数器。
您真正想要的是将输入视为 区分大小写 [A
和 a
应计为不同的字符。]
此外,正如 @coolguy 先生在他的评论中提到的,在使用 [=67= 之前检查 fopen()
的 return 值是否成功]ed指针。
解决方案:
- 不要使用
toupper()
转换输入。请改用实际输入。 - 如果要区分大小写,只检查用户输入和文件输入,不进行任何大小写转换。伪代码可能看起来像
.
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
int main(void)
{
FILE *fp1 = NULL;
char ch,f[100],c,d;
int ct=0;
printf("Enter the file name\n");
scanf("%s",f);
fp1=fopen(f,"r");
if (!fp)
{
printf("Cannot open file for reading\n");
exit(-1);
}
printf("Enter character:");
scanf(" %c",&c);
do
{
ch=fgetc(fp1);
if(ch == c)
++ct;
}while(ch!=EOF);
fclose(fp1);
printf("%d\n",ct);
return 0;
}