【问题标题】:Counting the number of occurrence of a character in a file in case-sensitive way以区分大小写的方式计算文件中字符的出现次数
【发布时间】:2015-06-20 03:19:04
【问题描述】:
#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 不区分大小写。这段代码有什么问题?

【问题讨论】:

  • The condition is a and A are case insensitive...恕我直言,你的意思正好相反。
  • 检查fopen 是否不返回NULL。如果是,则结束程序
  • 使用int ch, d, c 否则代码无法正确区分EOF 与所有其他256 个char

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


【解决方案1】:

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

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

将为两种情况增加计数器。

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

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

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

另外,正如 @coolguy 先生在他的 cmets 中提到的,在使用返回的指针之前,请检查 fopen() 的返回值是否成功。

解决办法:

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

【讨论】:

  • @WeatherVane 不要让我恐慌,伙计。 :-) 英语既不是我的母语,我也不流利。所以我的解释是正确的,对吧?
  • 完美,确实如此。我一发现我的错误就删除了我之前的评论。但你还是看到了!
  • @WeatherVane 请不要介意,只是想确定一下。不管怎么说,多谢拉。 ;-)
  • 只是想注意关于你的第二个要点,c==ch 实际上并没有得到评估,因为c==d 仍然是正确的,实际上对于这个输入总是正确的,因为cd 总是大写。
  • 注意:此代码可能会以多种方式失败:1) c &lt; 0,2) 用户为字符输入空格 ' ' 3) 文件包含字符 (char) EOF。可能这些都不是 OP 的大问题。建议int ch; unsigned char uc = c; while((ch = fgetc(fp1)) != EOF) if (ch == uc) ct++; }
猜你喜欢
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2013-12-23
  • 1970-01-01
  • 2015-05-03
相关资源
最近更新 更多