C - 程序只执行if else语句的1部分

时间:2015-04-10 00:50:46

标签: c if-statement

嘿所以我正在尝试创建一个程序,要求用户输入一个字母,然后计算该字母出现在.txt文档中的次数。 我有99%的代码完成它只是因为我先放的if语句是唯一一个给出正确金额的语句。

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define n 61 // Maximum size of file name

FILE* open_file(void) {
  char file_name[n]; FILE* input_file;
  printf("Enter name of the input file: "); scanf("%s", file_name);
  input_file = fopen(file_name, "r");
  while (input_file == NULL) {
    printf("\nERROR: File Not found \"%s\"\n", file_name);
    printf("Re-enter file name: ");
    scanf("%s", file_name);
    input_file = fopen(file_name, "r");}
  return input_file;}

void main() {
    char  inputLetter;
    char lowerLetter;
    char upperLetter;
    char chr;
    int upper;
    int lower;
    FILE* input_file = open_file();
    printf("Enter letter: ");
    scanf(" %c", &inputLetter);

    lowerLetter = tolower(inputLetter);
    upperLetter = toupper(inputLetter);
    while(1){
        chr = fgetc(input_file);
        if (chr == EOF){
            break;
        }
        else if(chr ==lowerLetter){
            lower++;
        }
        else if(chr == upperLetter){
            upper++;
        }
    }


    printf(" %c", inputLetter);
    printf(" %c %d ", lowerLetter, lower);
    printf(" %c %d ", upperLetter, upper);
  }

当读取带有22个小写e和2个大写2的.txt文档时,它将打印

e e 22 E 258

如果我用计数器切换两个if语句,它将打印

e e 278 E 2

我做错了什么,它不能正确计算?

2 个答案:

答案 0 :(得分:3)

因为您从未初始化upperlower,请在while (1)

之前尝试
upper = 0;
lower = 0;

并且你不需要那种我认为具有误导性的while (1)循环,如果你明确地使用break条件进行循环,那将会好很多,即

while ((chr = fgetc(input_file)) != EOF)
 {
    if (chr == lowerLetter)
        lower += 1;
    else if (chr == upperLetter)
        upper += 1;
 }

答案 1 :(得分:0)

这不是你的直接问题(iharob回答说),但是如果你读取包含非ASCII字符的文件,或者你在ARM系统上构建代码,则可能会出现错误。< / p>

tolowertoupperfgetc函数实际上不适用于char。它们使用int0范围内的255值,而char通常-128127的范围。 假设8位字符

将超出范围的值传递给to*is*函数会导致未定义的行为,EOF测试可能会出现误报或漏报。

所以代码的一部分应该是:

char inputLetter;
int  lowerLetter;
int  upperLetter;
int  chr;

// ...

lowerLetter = tolower( (unsigned char)inputLetter );
upperLetter = toupper( (unsigned char)inputLetter );

// the rest can stay unchanged