2012-10-12 9 views
7

Mam problem z programem, który próbuję kodować. To tylko program konsoli Windows i jestem bardzo nowy w C++. To tylko mój czwarty program.Porównanie z dosłownymi wynikami ciągów w nieokreślonym zachowaniu?

Problem polega na tym, że kiedy uruchamiam program, nie mam błędów, ale wiele ostrzeżeń, które mówią "porównanie z dosłownymi ciągami znaków w nieokreślonym zachowaniu" w liniach, które podkreślę poniżej.

Gdy program działa, zamiast dodawać liczby, chcę, żeby to właśnie dało mi losową ogromną liczbę, bez względu na to, co wprowadzę dla swoich danych wejściowych.

Oto kod:

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

Każda pomoc jest mile widziana. Prawdopodobnie jest coś wielkiego, co zrobiłem źle. Nazwy w instrukcjach if są obecnie symbolami zastępczymi, a ja dodam dużo więcej, jeśli stwierdzę, że mogę pracować z nierozstrzygniętymi 6, co jest niezbędne do działania.

+0

'if (items == 0)' to nie ma żadnego sensu.Nie przypisujesz dynamicznie "items", jest to zmienna stosu. To porównanie nigdy nie będzie prawdziwe. – Praetorian

Odpowiedz

12

W C++ == tylko realizowane wewnętrznie dla prymitywnych typów i tablica nie jest prymitywny typ, więc porównując char[100] i ciąg dosłowne tylko porównać je jako 2 char* lub lepiej powiedzieć jak 2 wskaźniki i od This 2 wskaźniki nie mogą być równe wtedy items[n] == "ae" nigdy nie może być prawdą, zamiast tego należy użyć std::string trzymać ciąg jako:

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

lub należy użyć strcmp porównać strun, ale zapamiętania strcmp zamian za 0 równe ciągi, więc twój kod będzie taki jak:

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

i jeden dodatkowy uwaga jest if (items == 0) jest bezużyteczny, ponieważ items alokowane na stosie, a nie w kupie!

+0

Dziękuję bardzo, udało mi się uzyskać kod do pracy, ale nadal daje zły wynik na końcu i nie mogę zrozumieć, dlaczego. – user1742497

5

Po pierwsze, int * price; jest zwisającym wskaźnikiem - nigdy go nie zainicjujesz. Trzeba zrobić:

int * price = new int[i]; 

Drugi, zazwyczaj, i oznacza indeks iterator więc proponuję trzymać się, że - tak

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

Po trzecie, trzeba porównać char tablic używając strncmp w przypadku .

czwarte i najważniejsze - użyj std::string i std::vector zamiast. To jest C++, a nie C.

1

Tylko trochę rzeczy, które got me potknięcia na trochę, jest różnica między pojedyncze i podwójne cudzysłowy, patrz: Single quotes vs. double quotes in C or C++

byłem porównując pierwszy znak ciąg z cudzysłowy i nie apostrofami - co wygenerował komunikat o błędzie powyżej.

Powiązane problemy