Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Comparison with string literal results in unspecified behaviour?

Tags:

c++

I am having a problem with the program I am trying to code. It's just a Windows console program and I am very new to C++. It's only my 4th program.

The problem I am having is that when I run my program I have no errors but a lot of warnings that say "comparison with string literal results in unspecified behaviour" in the lines that I will highlight below.

When the program runs instead of adding the numbers I want it to it just gives me a random huge number no matter what I put in for my inputs.

Here is the code:

#include <iostream>

using namespace std;

int main()
{
     int hold;
     int i;
     int n;
     i = 6;
     int result;
     int * price;
     char items[100][100];

     if (items == 0)
        cout << "No items can be stored";
    else
    {
        for (n=0; n<i; n++)
        {
            cout << "Item#" << n << ": ";
            cin >> items[n];
        }
        cout <<  "\nYou Entered: \n";
        for (n=0; n<i; n++)
            cout << items[n] << ", ";

    }
    for (n=0; n<i; n++)
    {
        if (items[n] == "ab"){
        price[n] = 2650;
        }

        else if (items[n] == "ae"){
        price[n] = 1925;
        }

        else if (items[n] == "ie"){
        price[n] = 3850;
        }

        else if (items[n] == "bt"){
        price[n] = 3000;
        }

        else if (items[n] == "pd"){
        price[n] = 2850;
        }

        else if (items[n] == "ga"){
        price[n] = 2600;
        }

    }

    for (n=0; n<i; n++)
    {
    result = result + price[n];
    }

    cout << "\nTotal gold for this build: " << result;
    cin >> hold;
    return 0;
}

Any help is appreciated. There is probably something big that I've done wrong. The names in the if statements are all currently placeholders and I'll be adding a lot more if statements when I can get it to work with the bare 6 which is what it needs to work.

like image 995
user1742497 Avatar asked Oct 12 '12 22:10

user1742497


People also ask

How do you compare string literals?

To compare string literals, still use the equality and relational operators, but for objects of the string class, and not for const char*s. Using the operators for const char*s compares the pointers, and not the string literals.

What are examples of string literals?

A string literal is a sequence of zero or more characters enclosed within single quotation marks. The following are examples of string literals: 'Hello, world!' 'He said, "Take it or leave it."'

What does string literal mean?

A "string literal" is a sequence of characters from the source character set enclosed in double quotation marks (" "). String literals are used to represent a sequence of characters which, taken together, form a null-terminated string.

Can we compare string literal with string object?

Important points about String comparison 1) You can compare two String variable using == operator but you should never do this because it will return true if you compare String literals but return false if you compare String object to a literal or two String object, even if they have same characters.


2 Answers

In C++ == only implemented internally for primitive types and array is not a primitive type, so comparing char[100] and string literal will only compare them as 2 char* or better to say as 2 pointers and since this 2 pointers can't be equal then items[n] == "ae" can never be true, instead of this you should either use std::string to hold string as:

std::string items[100];
// initialize items
if( items[n] == "ae" ) ...

or you should use strcmp to compare strings, but remeber strcmp return 0 for equal strings, so your code will be as:

char items[100][100];
// initialize items
if( strcmp(items[n], "ae") == 0 ) ...

And one extra note is if (items == 0) is useless, since items allocated on stack and not in the heap!

like image 162
BigBoss Avatar answered Oct 05 '22 23:10

BigBoss


First, int * price; is a dangling pointer - you never initialize it. You have to do:

int * price = new int[i];

Second, usually, i denotes an iterator index so I suggest you stick with that - so

for (i=0; i<n; i++) //some more refactoring needed

Third, you need to compare char arrays using strncmp in your case.

Fourth and most important - use std::string and std::vector instead. This is C++, not C.

like image 28
Luchian Grigore Avatar answered Oct 05 '22 23:10

Luchian Grigore