[英]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
我做錯了,不能正確計算兩者?
因為您永遠不會初始化upper
或lower
,所以請在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系統上構建代碼,則可能會出現此錯誤。
tolower
, toupper
和fgetc
函數實際上不適用於char
。 它們使用int
值,范圍為0
到255
,而char
通常采用-128
到127
范圍。 假設為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.