Мой код для подсчета символов неправильно подсчитывает символы. Почему? - PullRequest
1 голос
/ 25 февраля 2020

Входной файл содержит 4 элемента, но программа, кажется, считает больше элементов. Я пытался создать функцию, которая будет считать элементы, которые были прописными в текстовом файле.

#include<iostream>
#include<fstream>
using namespace std;
bool ckeckCap(char ch){
    if((ch>='A')&&(ch<='Z')){
        return true;
        return false;
    }
}
int main(){
    ifstream inputFile;
    char ch;
    bool cap;
    int capa=0;
    int count=0;
    inputFile.open("input.txt");
    if(!inputFile.is_open()){
        cout<<"Error opening...Aborting"<<endl;
        return 0;
    }
    while(!inputFile.eof()){
        inputFile>>ch;
        cap=ckeckCap(ch);
        if(cap==true)
        capa=capa+1;
        //inputFile>>ch;
    }
    cout<<capa;
    return 0;
}

Ответы [ 2 ]

3 голосов
/ 25 февраля 2020

Вы видите непоследовательное количество записей, прочитанных из файла из-за

while(!inputFile.eof())

Это неправильно. См. Почему iostream :: eof внутри условия al oop (то есть `while (! Stream.eof ())`) считается неправильным?

Далее, это:

bool ckeckCap(char ch){
    if((ch>='A')&&(ch<='Z')){
        return true;
        return false;
    }
}

Должно быть

bool ckeckCap(char ch){
    if((ch>='A')&&(ch<='Z')){
        return true;
    }
    return false;
}

или, скорее,

bool ckeckCap(char ch){
    return ((ch>='A')&&(ch<='Z'));
}

Обратите внимание, что это короче, легче для чтения, и вы не можете совершить ту же ошибку, что и выше.

В вашем коде return false; никогда не будет достигнут. Если условие оценивается как false, вы не возвращаетесь из функции, объявленной для возврата bool. Это вызывает неопределенное поведение.

Не проблема в вашем коде, но это выглядит подозрительно:

char ch;
bool cap;

Использование переменных до их инициализации является распространенной ошибкой (потенциально также UB). Этого можно избежать, объявив переменные только тогда, когда вы можете инициализировать их с каким-либо значимым значением, или, если это невозможно, инициализируйте их с некоторым значением, например:

char ch = ' ';
bool cap = false;    
1 голос
/ 25 февраля 2020

В основном все проблемы уже были упомянуты.

И, кроме устранения очевидных ошибок, я дополнительно покажу более современное решение C ++. Используя современные языковые конструкции, можно избежать ошибок, подобных приведенным выше.

Пожалуйста, см .:

#include <iostream>
#include <fstream>
#include <algorithm>
#include <iterator>
#include <cctype>

int main() {

    // Open the input file and check, if it could be opened
    if (std::ifstream inputFileStream("r:\\input.txt"); inputFileStream) {

        // Iterate over the characters in the input file and output count of uppercase characters
        std::cout << std::count_if(std::istreambuf_iterator<char>(inputFileStream), {}, std::isupper);
    }
    else {
        // If the input file could not be opened, then inform user
        std::cerr << "\n*** Error: Could not open input file\n";
    }
    return 0;
}
...