Vergelijking met letterlijke tekenreeksen resulteert in niet-gespecificeerd gedrag?

Ik heb een probleem met het programma dat ik probeer te coderen. Het is gewoon een Windows-consoleprogramma en ik ben erg nieuw in C++. Het is pas mijn 4e programma.

Het probleem dat ik heb is dat wanneer ik mijn programma start, ik geen fouten heb, maar veel waarschuwingen die zeggen “vergelijking met letterlijke tekenreeksen resulteert in niet-gespecificeerd gedrag” in de regels die ik hieronder zal benadrukken.

Als het programma wordt uitgevoerd in plaats van de getallen toe te voegen die ik wil, krijg ik gewoon een willekeurig groot getal, ongeacht wat ik invoer voor mijn invoer.

Hier is de 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;
}

Elke hulp wordt op prijs gesteld. Er is waarschijnlijk iets groots dat ik verkeerd heb gedaan. De namen in de IF-verklaringen zijn allemaal tijdelijke tijdelijke aanduidingen en ik zal veel meer toevoegen als uitspraken wanneer ik het kan krijgen om met de blote 6 te werken, wat het nodig is om te werken.


Antwoord 1, Autoriteit 100%

In C++ ==Alleen intern geïmplementeerd voor primitieve typen en array is geen primitief type, dus het vergelijken van char[100]en string letterlijk zal ze alleen als 2 vergelijken char*Of beter om te zeggen als 2 aanwijzingen en aangezien deze 2 aanwijzingen niet gelijk kunnen zijn dan items[n] == "ae"kan nooit waar zijn, in plaats van Dit moet u ofwel std::stringgebruiken om het string te houden als:

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

Of u moet strcmpgebruiken om snaren te vergelijken, maar Remeber strcmpRETURNEN 0 voor gelijke snaren, zodat uw code is als:

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

en één extra noot is if (items == 0)is nutteloos, sinds itemstoegewezen op stapel en niet in de heap!


Antwoord 2, Autoriteit 30%

Ten eerste, int * price;is een bungelende aanwijzer – je initialiseert het nooit. Je moet doen:

int * price = new int[i];

Ten tweede, meestal, iDuidt een iterator-index aan, dus ik stel voor dat u bij dat blijft – dus

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

Ten derde moet u char-arrays vergelijken met behulp van strncmpin uw geval.

Vierde en belangrijkste– gebruik in plaats daarvan std::stringen std::vector. Dit is C++, niet C.


Antwoord 3, autoriteit 13%

Een kleinigheidje waar ik even over struikelde, is het verschil tussen enkele en dubbele aanhalingstekens, zie: Enkele aanhalingstekens versus dubbele aanhalingstekens in C of C++

Ik vergeleek het eerste teken van een string met dubbele aanhalingstekens en niet met enkele aanhalingstekens – wat resulteerde in de bovenstaande foutmelding.


Antwoord 4, autoriteit 4%

Je vergelijkt pointers, niet de daadwerkelijke strings. Gebruik de klasse C++ stringin plaats van char*(of controleer hoe C-strings werken).

Other episodes