簡體   English   中英

C-程序僅執行if else語句的一部分

[英]C - Program only doing 1 part of a if else 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

我做錯了,不能正確計算兩者?

因為您永遠不會初始化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;
 }

這不直接是您的問題(iharob回答了),但是如果您讀取的文件包含非ASCII字符,或者例如在ARM系統上構建代碼,則可能會出現此錯誤。

tolowertoupperfgetc函數實際上不適用於char 它們使用int值,范圍為0255 ,而char通常采用-128127范圍。 假設為8位char

將超出范圍的值傳遞給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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM