与字符串文本进行比较会导致未指定的行为
Comparison with string literal results in unspecified behaviour?
我尝试编写的程序有问题。这只是一个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::string
和std::vector
。这是C++,而不是C。
磕绊绊的小事是单引号和双引号之间的区别,请参阅: C 或 C++ 中的单引号与双引号
我正在将字符串的第一个字符与双引号而不是单引号进行比较 - 这导致了上面的错误消息。
您正在比较指针,而不是实际的字符串。使用类而不是char*
C++ string
(或检查 C 字符串的工作原理)。
- 从 XML 中读取未指定结构的每个数据成员
- 用数据填充未指定大小的数组
- 访问从联合与另一个成员集复制的联合中的一个成员是否未定义或未指定?
- 双循环变量的相等条件:未指定还是未定义
- SQL Server-未找到数据源名称,也未指定默认驱动程序
- 无法创建长度未指定
- 在Visual Studio中更新Qt翻译(.ts文件)时出现未指定错误
- 是否未指定在未评估的上下文中实例化模板/lambda
- 未定义与未指定与实现定义的行为
- 在 c++ 中获取未指定数量的输入
- 摆动,传递未指定维度的阵列
- 在尝试提交作业警告时,我一直在警告:与未指定行为的字符串字面结果比较[-WADDRESS]
- 我的基本C 程序中有一个未指定的错误
- OPENCV错误:未指定的错误(未实现该函数)
- 函数参数中数组大小未指定
- 从源代码编译 openCV:*** 未指定目标,也未找到生成文件.停
- 与字符串文本进行比较会导致未指定的行为
- C++:警告:与字符串文本进行比较会导致未指定的行为 [-Waddress]
- 字符串字面值的比较会导致未指定的行为- c++
- 是c++中指针比较未定义或未指定的行为