Hingle McCringleberry
Hingle McCringleberry

Reputation: 53

c++ error c2015: too many characters in constant

Sorry if it's something simple, but I'm new to C++ and haven't really gotten a good hold on it, yet. I need to build a calculator whose only named variables are pointers, and this is what I have so far, but I keep getting errors and I can't figure out why. Every error that always related to my if construct, though.

int main()
{
    //Creating variables

    //Values to perform operations on
    float *aptr = new(nothrow)float;
    float *bptr = new(nothrow)float;
    float *ansptr = new(nothrow)float;
    int *endptr = new(nothrow)int;
    char *operationptr = new(nothrow)char;

    cout << "Simple Operation Calculator" << endl; //Displays program name
    cout  << "Performs +, -, *, or / on any two real operands." << endl; //Describes nature of program to user

    *endptr = 1;
    while(*endptr = 1) //Creates a loop so that the user may perform as many operations as desired
    {
        //Prompts the user for the first operand
        cout << "First operand: " << endl;
        cin >> *aptr;

        //Prompts user for operator
        cout << "Operator(+,-,*,/): " << endl;
        cin >> *operationptr;

        //Prompts user for second operand
        cout << "Second operand: " << endl;
        cin >> *bptr;

        //Performs requested operation
        if(*operationptr == '+' || *operationptr == 'plus')
        {
            *ansptr = *aptr + *bptr;
        }
        else if(*operationptr == '-' || *operationptr == 'minus')
        {
            *ansptr = *aptr - *bptr;
        }
        else if(*operationptr == '*' || *operationptr ==  'times')
        {
            *ansptr = *aptr * *bptr;
        }
        else if(*operationptr == '/' || *operationptr == 'divided by')
        {
            if(*bptr = 0)
            {
                cout << "Cannot divide by zero. Terminating program." << endl;
                *endptr = 2;
                break;
            }
            *ansptr = *aptr / *bptr;
        }
        else
        {
            cout << "Invalid operand input. Terminating program." << endl;
            *endptr = 2;
            break;
        }

        //Displays results
        cout << *aptr << *operationptr << *bptr << " = " << *ansptr << endl;

        //Asks user if they wish to perform another operation. If so, they stay in loop. If not, then break from loop.
        cout << "Do you wish to perform another operation? (1 = yes, 2 = no)" << endl;
        cin >> *endptr;

        //If 1, loop repeats. If 2, program ends.
        if (*endptr == 2)
        {
            cout << "Thank you for using my program. Goodbye!" << endl;
        }
    } //end while loop

    return 0;

 }//end main function

Upvotes: 3

Views: 34193

Answers (2)

Almo
Almo

Reputation: 15861

'plus'

is a character constant, and can't contain more than one character.

'+' is fine, since it's a single character in a constant.

As per the comment on this answer,

'plus' could be ok, if the compiler is not expecting a char.

Upvotes: 5

Joseph Mansfield
Joseph Mansfield

Reputation: 110738

There are character literals (with ') and string literals (with "). Character literals have one character. String literals are arrays of characters. You can't write something like 'plus' because it has more than one character (well technically you can, but it's a multi-character literal, but lets not go there).

Nonetheless, this wouldn't make any sense because operationptr points at a single char object. A single char can't contain the entire word plus.

If you want to be able to accept plus as input, then I suggest you start using strings. In fact, use std::string.

As a side note, you are using pointers and dynamic allocation far too often. You are also forgetting to delete the objects that you create with new - this is a memory leak. I imagine you have come from a language that uses new for all object creation. In C++, this is not necessary (and is not a good practice). Instead, you can declare objects like so:

float aptr;

There is no need to dereference this object. You can just use aptr directly as a float.

Upvotes: 9

Related Questions