与字符串文本进行比较会导致未指定的行为

Comparison with string literal results in unspecified behaviour?

本文关键字:未指定 比较 字符串 文本      更新时间:2023-10-16

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

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

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

这是代码:

#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 语句中的名称目前都是占位符,当我可以让它与 bare 6 一起使用时,我将添加更多的 if 语句,这是它需要工作的。

在C++ ==中,仅在内部为基元类型实现,数组不是基元类型,因此比较char[100]和字符串文字只会将它们比较为 2 个char*或更好,可以说是 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堆栈而不是堆中分配的!

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

int * price = new int[i];

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

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

第三,您需要使用strncmp来比较字符数组。

第四个也是最重要的 - 改用std::stringstd::vector。这是C++,而不是C。

让我磕

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

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

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