以区分大小写的方式计算文件中字符的出现次数 #包括 #包括 #包括 int main() { 文件*fp1; 字符ch,f[100],c,d; int-ct=0; printf(“输入文件名\n”); scanf(“%s”,f); fp1=fopen(f,“r”); printf(“输入字符:”); scanf(“%c”、&c); c=toupper(c); 做 { ch=fgetc(fp1); d=toupper(ch); 如果(c==d | | c==ch) ++ct; }while(ch!=EOF); fclose(fp1); printf(“\n”); printf(“%d”,ct); 返回0; }
这里我的文件包含以区分大小写的方式计算文件中字符的出现次数 #包括 #包括 #包括 int main() { 文件*fp1; 字符ch,f[100],c,d; int-ct=0; printf(“输入文件名\n”); scanf(“%s”,f); fp1=fopen(f,“r”); printf(“输入字符:”); scanf(“%c”、&c); c=toupper(c); 做 { ch=fgetc(fp1); d=toupper(ch); 如果(c==d | | c==ch) ++ct; }while(ch!=EOF); fclose(fp1); printf(“\n”); printf(“%d”,ct); 返回0; },c,file,char,case-sensitive,case-insensitive,C,File,Char,Case Sensitive,Case Insensitive,这里我的文件包含aAaAaA,当我执行这段代码时,我在文件中得到6个字符,但我应该得到3个字符,因为a和a不区分大小写。这段代码怎么了?在您的代码中,基本上是无条件地递增计数器 将增加这两种情况下的计数器 正如当前编写的代码一样。对于a或a的输入,c始终是a,因此 当从文件中读取a时,d是a,因此,c==d给出TRUE,递增计数器 当从文件中读取A时,ch是A,因此d从而c==d给出真值,递增计数器 你真正想要的是把输入看作是强>区分大小写< /强> [ a < /代码>和 a 应被计算为不
aAaAaA
,当我执行这段代码时,我在文件中得到6个字符,但我应该得到3个字符,因为a和a不区分大小写。这段代码怎么了?在您的代码中,基本上是无条件地递增计数器
将增加这两种情况下的计数器
正如当前编写的代码一样。对于a
或a
的输入,c
始终是a
,因此
- 当从文件中读取
时,a
是d
,因此,a
给出TRUE,递增计数器c==d
- 当从文件中读取
时,A
是ch
,因此A
从而d
给出真值,递增计数器c==d
你真正想要的是把输入看作是强>区分大小写< /强> [<代码> a < /代码>和<代码> a <代码>应被计算为不同字符。 另外,正如@coolguy先生在他的评论中提到的,在使用返回的指针之前,检查
fopen()
的返回值是否成功
解决方案:
toupper()
转换输入。使用实际输入代替#包括
#包括
#包括
内部主(空)
{
文件*fp1=NULL;
字符ch,f[100],c,d;
int-ct=0;
printf(“输入文件名\n”);
scanf(“%s”,f);
fp1=fopen(f,“r”);
如果(!fp)
{
printf(“无法打开文件进行读取\n”);
出口(-1);
}
printf(“输入字符:”);
scanf(“%c”、&c);
做
{
ch=fgetc(fp1);
if(ch==c)
++ct;
}while(ch!=EOF);
fclose(fp1);
printf(“%d\n”,ct);
返回0;
}
在您的代码中,本质上是无条件递增计数器
将增加这两种情况下的计数器
正如当前编写的代码一样。对于a
或a
的输入,c
始终是a
,因此
- 当从文件中读取
时,a
是d
,因此,a
给出TRUE,递增计数器c==d
- 当从文件中读取
时,A
是ch
,因此A
从而d
给出真值,递增计数器c==d
你真正想要的是把输入看作是强>区分大小写< /强> [<代码> a < /代码>和<代码> a <代码>应被计算为不同字符。 另外,正如@coolguy先生在他的评论中提到的,在使用返回的指针之前,检查
fopen()
的返回值是否成功
解决方案:
toupper()
转换输入。使用实际输入代替#包括
#包括
#包括
内部主(空)
{
文件*fp1=NULL;
字符ch,f[100],c,d;
int-ct=0;
printf(“输入文件名\n”);
scanf(“%s”,f);
fp1=fopen(f,“r”);
如果(!fp)
{
printf(“无法打开文件进行读取\n”);
出口(-1);
}
printf(“输入字符:”);
scanf(“%c”、&c);
做
{
ch=fgetc(fp1);
if(ch==c)
++ct;
}while(ch!=EOF);
fclose(fp1);
printf(“%d\n”,ct);
返回0;
}
在您的代码中,本质上是无条件递增计数器
将增加这两种情况下的计数器
正如当前编写的代码一样。对于a
或a
的输入,c
始终是a
,因此
- 当从文件中读取
时,a
是d
,因此,a
给出TRUE,递增计数器c==d
- 当从文件中读取
时,A
是ch
,因此A
从而d
给出真值,递增计数器c==d
你真正想要的是把输入看作是强>区分大小写< /强> [<代码> a < /代码>和<代码> a <代码>应被计算为不同字符。 另外,正如@coolguy先生在他的评论中提到的,在使用返回的指针之前,检查
fopen()
的返回值是否成功
解决方案:
toupper()
转换输入。使用实际输入代替#包括
#包括
#包括
内部主(空)
{
文件*fp1=NULL;
字符ch,f[100],c,d;
int-ct=0;
printf(“输入文件名\n”);
scanf(“%s”,f);
fp1=fopen(f,“r”);
如果(!fp)
{
printf(“无法打开文件进行读取\n”);
出口(-1);
}
printf(“输入字符:”);
scanf(“%c”、&c);
做
{
ch=fgetc(fp1);
if(ch==c)
++ct;
}while(ch!=EOF);
fclose(fp1);
printf(“%d\n”,ct);
返回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;
}
if(c==d || c==ch)
^ ^
| |
UPPERCASE original
#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;
}