14

我尝试编写的程序有问题。它只是一个 Windows 控制台程序,我对 C++ 很陌生。这只是我的第四个程序。

我遇到的问题是,当我运行我的程序时,我没有错误,但是在我将在下面突出显示的行中有很多警告说“与字符串文字比较会导致未指定的行为”。

当程序运行而不是添加我想要的数字时,无论我输入什么,它都会给我一个随机的巨大数字。

这是代码:

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

任何帮助表示赞赏。我可能做错了什么大事。if 语句中的名称当前都是占位符,当我可以让它与它需要工作的裸 6 一起工作时,我将添加更多的 if 语句。

4

4 回答 4

23

在 C++==中,仅在内部实现了原始类型,而数组不是原始类型,因此比较char[100]和字符串文字只会将它们比较为 2char*或更好地说为 2 个指针,并且由于这 2 个指针不能相等,items[n] == "ae"所以永远不可能是真的,而不是这个,您应该使用std::string将字符串保存为:

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

或者你应该使用strcmp比较字符串,但记住strcmp返回 0 相等的字符串,所以你的代码将是:

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

还有一点if (items == 0)是没用的,因为items分配在堆栈上而不是堆上!

于 2012-10-12T23:18:09.247 回答
7

首先,int * price;是一个悬空指针——你永远不会初始化它。你所要做的:

int * price = new int[i];

其次,通常i表示迭代器索引,所以我建议您坚持使用它 - 所以

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

第三,您需要比较strncmp在您的情况下使用的 char 数组。

第四也是最重要的- 使用std::stringandstd::vector代替。这是 C++,不是 C。

于 2012-10-12T22:51:42.510 回答
3

只是让我有点磕磕绊绊的小事,是单引号和双引号之间的区别,请参阅:C 或 C++ 中的单引号与双引号

我将字符串的第一个字符与双引号而不是单引号进行比较 - 这导致了上面的错误消息。

于 2013-08-21T07:40:23.830 回答
1

您正在比较指针,而不是实际的字符串。使用 C++string类代替char*(或检查C 字符串如何工作)。

于 2012-10-12T22:51:29.950 回答