以区分大小写的方式计算文件中字符出现的次数

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

将为两个案例增加计数器。

正如目前编写的代码。对于 aA 的输入,c 总是 A,因此

  • 当从文件中读取 a 时,dA,因此,c==d 为 TRUE,递增计数器
  • 当从文件中读取 A 时,chA,因此 d 从而 c==d 给出 TRUE,递增计数器。

您真正想要的是将输入视为 区分大小写 [Aa 应计为不同的字符。]

此外,正如 @coolguy 先生在他的评论中提到的,在使用 [=67= 之前检查 fopen() 的 return 值是否成功]ed指针。

解决方案:

  1. 不要使用 toupper() 转换输入。请改用实际输入。
  2. 如果要区分大小写,检查用户输入和文件输入,不进行任何大小写转换。伪代码可能看起来像

.

 #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;    
}