2012-10-12 33 views
7

Tôi đang gặp sự cố với chương trình mà tôi đang cố gắng viết mã. Nó chỉ là một chương trình điều khiển Windows và tôi rất mới với C++. Nó chỉ là chương trình thứ 4 của tôi.So sánh với kết quả bằng chữ trong hành vi không xác định?

Vấn đề tôi gặp phải là khi tôi chạy chương trình của mình, tôi không có lỗi nhưng rất nhiều cảnh báo cho biết "so sánh với kết quả chuỗi chữ trong hành vi không xác định" trong các dòng mà tôi sẽ làm nổi bật bên dưới.

Khi chương trình chạy thay vì thêm các số tôi muốn nó, nó chỉ mang lại cho tôi một số lượng lớn ngẫu nhiên bất kể tôi nhập gì vào đầu vào của mình.

Đây là mã:

#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. Có lẽ có điều gì đó to lớn mà tôi đã làm sai. Các tên trong các câu lệnh if là tất cả các trình giữ chỗ hiện tại và tôi sẽ bổ sung thêm rất nhiều nếu các câu lệnh khi tôi có thể làm cho nó hoạt động với bare 6, đó là những gì nó cần để làm việc.

+0

'if (items == 0)' không có ý nghĩa gì cả.Bạn không phân bổ động 'các mục', nó là một biến ngăn xếp. Sự so sánh đó sẽ không bao giờ đúng. – Praetorian

Trả lời

12

Trong C++ == chỉ thực hiện trong nội bộ với nhiều loại nguyên thủy và mảng không phải là một loại nguyên thủy, vì vậy so sánh char[100] và chuỗi chữ sẽ chỉ so sánh chúng như 2 char* hoặc tốt hơn để nói là 2 con trỏ và từ này 2 con trỏ không thể bằng nhau thì items[n] == "ae" không bao giờ có thể là đúng, thay vì điều này, bạn nên sử dụng một trong hai std::string để giữ chuỗi như:

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

hoặc bạn nên sử dụng strcmp để so sánh chuỗi, nhưng hãy nhớ strcmp return 0 cho các chuỗi bằng nhau, vì vậy mã của bạn sẽ là:

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

Và một lưu ý bổ sung là if (items == 0) là vô ích, vì items được cấp phát trên ngăn xếp chứ không phải trong vùng lưu trữ!

+0

Thankyou rất nhiều Tôi đã quản lý để có được mã để làm việc nhưng nó vẫn kết quả đầu ra sai ở cuối và tôi không thể hiểu tại sao. – user1742497

1

Bạn so sánh con trỏ chứ không phải chuỗi thực tế. Sử dụng C++ string lớp thay vì char* (hoặc kiểm tra how C strings work).

5

Đầu tiên, int * price; là một con trỏ lơ lửng - bạn không bao giờ khởi tạo nó. Bạn phải làm:

int * price = new int[i]; 

Thứ hai, thường, i biểu thị một chỉ số iterator vì vậy tôi đề nghị bạn dính với điều đó - vì vậy

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

Thứ ba, bạn cần phải so sánh mảng char sử dụng strncmp trong trường hợp của bạn .

Thứ tư và quan trọng nhất - sử dụng std::stringstd::vector thay thế. Đây là C++, không C.

1

Chỉ cần một điều nhỏ mà đã cho tôi ngại cho một chút, là sự khác biệt giữa dấu nháy đơn và đôi, xem: Single quotes vs. double quotes in C or C++

Tôi đã so sánh ký tự đầu tiên của một chuỗi với dấu ngoặc kép và không có dấu ngoặc kép duy nhất - đó dẫn đến thông báo lỗi trên.

Các vấn đề liên quan