#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不区分大小写。这段代码有什么问题?
答案 0 :(得分:3)
在您的代码中,基本上,您无条件地递增计数器。
if(c==d || c==ch)
^ ^
| |
UPPERCASE original
会增加两者案件的计数器。
由于代码目前已编写。对于a
或A
的输入,c
总是 A
,所以
a
时,d
为A
,因此,c==d
为TRUE,递增计数器A
时,ch
为A
,因此d
c==d
为A
为TRUE,递增计数器。您真正想要的是将输入视为区分大小写 [a
和fopen()
应计为不同的字符。]
此外,正如 @coolguy 先生在评论中提到的那样,在使用返回的指针之前检查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;
}
转换输入。改为使用实际输入。
{{1}}