我正在尝试编写程序的问题。它只是一个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语句。
答案 0 :(得分:16)
在C ++中==
仅在内部为原始类型实现,而数组不是原始类型,因此比较char[100]
和字符串文字只会将它们比较为2 char*
或更好地说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
在堆栈上分配而不在堆中!
答案 1 :(得分:5)
首先,int * price;
是一个悬空指针 - 你永远不会初始化它。你必须这样做:
int * price = new int[i];
第二,通常,i
表示迭代器索引,所以我建议你坚持下去 - 所以
for (i=0; i<n; i++) //some more refactoring needed
第三,你需要在你的情况下使用strncmp
比较char数组。
第四个也是最重要的 - 请改用std::string
和std::vector
。这是C ++,而不是C。
答案 2 :(得分:1)
你在比较指针,而不是实际的字符串。使用C ++ string
类代替char*
(或选中how C strings work)。
答案 3 :(得分:1)
让我感到磕磕绊绊的一件小事,是单引号和双引号之间的区别,请参阅:Single quotes vs. double quotes in C or C++
我将字符串的第一个字符与双引号而不是单引号进行比较 - 这导致了上面的错误消息。