2012-10-12 6 views
7

Ho un problema con il programma che sto cercando di codificare. È solo un programma per console Windows e sono molto nuovo in C++. È solo il mio quarto programma.Il confronto con risultati letterali stringa in un comportamento non specificato?

Il problema che sto avendo è che quando eseguo il mio programma non ho errori, ma un sacco di avvertimenti che dicono "il confronto con la stringa di risultati letterali nel comportamento non specificato" nelle righe che mi metterà in evidenza qui di seguito.

Quando il programma viene eseguito anziché aggiungere i numeri che desidero, mi dà un numero enorme a caso, indipendentemente da ciò che ho inserito per i miei input.

Ecco il codice:

#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; 
} 

Ogni aiuto è apprezzato. C'è probabilmente qualcosa di grosso in cui ho sbagliato. I nomi nelle istruzioni if ​​sono tutti segnaposto e aggiungerò molto altro se affermazioni quando potrò farlo funzionare con la nuda 6, che è ciò di cui ha bisogno per funzionare.

+0

'if (items == 0)' che non ha alcun senso.Non stai allocando dinamicamente 'item', è una variabile stack. Quel paragone non sarà mai vero. – Praetorian

risposta

12

In C++ == solo implementato internamente per i tipi primitivi e la matrice non è un tipo primitivo, così confrontando char[100] e stringa letterale confronterà solo loro come 2 char* o per meglio dire come 2 puntatori e dal questo 2 puntatori non possono essere uguali quindi items[n] == "ae" potrà mai essere vera, invece di questo si dovrebbe usare sia std::string per contenere stringa come:

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

o si dovrebbe utilizzare strcmp per confrontare le stringhe, ma ricordate strcmp return 0 per stringhe uguali, quindi il tuo codice sarà il seguente:

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

E una nota in più è if (items == 0) è inutile, dal momento che items allocata sulla pila e non nel mucchio!

+0

Grazie mille sono riuscito a far funzionare il codice, ma alla fine restituisce il risultato sbagliato e non riesco a capire perché. – user1742497

1

Stai confrontando i puntatori, non le stringhe reali. Utilizzare la classe C++ string anziché char* (o controllare how C strings work).

5

Innanzitutto, int * price; è un puntatore pendente: non lo si inizializza mai. Quello che dovete fare:

int * price = new int[i]; 

In secondo luogo, di solito, i denota un indice iteratore quindi vi suggerisco di bastone con che - così

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

In terzo luogo, è necessario confrontare array char utilizzando strncmp nel tuo caso .

Quarto e più importante - utilizzare std::string e std::vector invece. Questo è C++, non C.

1

Solo una piccola cosa che mi ha fatto inciampare per un po ', è la differenza tra virgolette singole e doppie, vedere: Single quotes vs. double quotes in C or C++

stavo confrontando il primo carattere di una stringa con virgolette e non virgolette singole - che ha generato il messaggio di errore sopra.

Problemi correlati