嘿所以我正在尝试创建一个程序,要求用户输入一个字母,然后计算该字母出现在.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
我做错了什么,它不能正确计算?
答案 0 :(得分:3)
因为您从未初始化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;
}
答案 1 :(得分:0)
这不是你的直接问题(iharob回答说),但是如果你读取包含非ASCII字符的文件,或者你在ARM系统上构建代码,则可能会出现错误。< / p>
tolower
,toupper
和fgetc
函数实际上不适用于char
。它们使用int
到0
范围内的255
值,而char
通常-128
到127
的范围。 假设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