ITFreak91
ITFreak91

Reputation: 13

C++ Strings Matching Returning False

I'm working on my C++ assignment. I'm having an issue with string comparison.

I'm comparing two apparently identical strings using == operating but the condition returns false. The debugger also shows that both strings (stored in different variables) are identical. I must be missing something.

Here is my code:

void classCounter() {

    ifstream fread;
    string linetxt;
    char *records[50];
    char myLine[100];
    char delims[] = "|";
    int btotal=0,etotal=0,total=0;

    fread.open("F:\\myfile.txt");

    while(!fread.eof()) {

        getline(fread,linetxt,'\n');

        int i = 0;
        strcpy(myLine, linetxt.c_str());
        records[i] = strtok( myLine, delims );

        while( records[i] != NULL  ) 
        {
            cout << records[i] << "|";

            char *bu = "Business";

            if(records[i] == bu) {
                btotal++;

            }
            if(records[i] == "Economy") {
                etotal++;

            }

            //printf("%d '%s'\n", i, records[i]);
            records[++i] = strtok( NULL, delims );
            break;
        }

        total++;
    }

    cout << "Total number of booked Business seats: " << btotal << endl;
    cout << "Total number of booked Economy seats: " << etotal << endl;

    cout << "Total number of booked seats: " << total << endl << endl;

}

Here is what debugger shows:

enter image description here

Both if conditions are returning false.

Please suggest what could be the issue.

Upvotes: 0

Views: 2550

Answers (4)

Jerry Coffin
Jerry Coffin

Reputation: 490178

So I'm going to assume your input file looks something like:

Business|Economy|Economy|Economy|Business
Economy|Economy|Economy|Business|Economy

...and so on. Correct? And you're trying to count up how many of each kind of ticket was sold?

If so, I'd write the code quite a bit differently. I'd probably do something like this:

std::map<std::string, int> tickets;

std::string name;
std::ifstream in("f:/myfile.txt");

int total = 0;

while (std::getline(in, name, '|')) {
   ++tickets[name];
   ++total;
}

for (auto t : tickets)
    std::cout << "Total number of booked " << t.first << " seats is: " << t.second "\n";
std::cout << "Total number of booked tickets: " << total << "\n";

Upvotes: 0

amza
amza

Reputation: 810

Your debugger is telling you what you need to know.. You're using char* instead of String so your char* are pointers. Your program is comparing two pointers and 0x00c93bc0 != 0x002af824.

Use strcmp in the future to avoid this problem

Upvotes: 0

R Sahu
R Sahu

Reputation: 206617

        if(records[i] == bu) {

and

        if(records[i] == "Economy") {

compare two char*, not strings.

You can compare them as strings by using std::string or using the function strcmp.

Option 1: Use std::string

std::string records[50];

With that change,

        if(records[i] == bu) {

and

        if(records[i] == "Economy") {

should work.

Option 2: Use strcmp

        if( strcmp(records[i], bu) == 0) {

and

        if( strcmp(records[i], "Economy") == 0) {

Upvotes: 3

Some programmer dude
Some programmer dude

Reputation: 409196

You are comparing two pointers, and they will never be the same. Either heed the advice to use std::string (what I recommend too) or you use strcmp to compare strings.

Upvotes: 5

Related Questions