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

时间:2015-04-14 13:27:04

标签: c file char case-sensitive case-insensitive

#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不区分大小写。这段代码有什么问题?

1 个答案:

答案 0 :(得分:3)

在您的代码中,基本上,您无条件地递增计数器

if(c==d   ||   c==ch)
      ^            ^
      |            |
UPPERCASE       original

会增加两者案件的计数器。

由于代码目前已编写。对于aA的输入,c 总是 A,所以

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

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

此外,正如 @coolguy 先生在评论中提到的那样,在使用返回的指针之前检查toupper()的返回值是否成功。

解决方案:

  1. 请勿使用 #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; } 转换输入。改为使用实际输入。
  2. 如果您需要区分大小写操作,检查用户输入和文件输入,而不进行任何大小写转换。伪代码可能看起来像
  3. {{1}}