以区分大小写的方式计算文件中字符的出现次数 #包括 #包括 #包括 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
    ,因此,
    c==d
    给出TRUE,递增计数器
  • 当从文件中读取
    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
      ,因此,
      c==d
      给出TRUE,递增计数器
    • 当从文件中读取
      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
      ,因此,
      c==d
      给出TRUE,递增计数器
    • 当从文件中读取
      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;    
    }