你好,我的学校c ++实验室有问题,我的bool算子>如果lhs大于rhs,则应该返回true,但是它总是返回false。我尝试打印出lhs.tostring(),它会正确显示数字。
我的lhs和rhs是一个字符串值。
由于学校工作的信心有限,我不允许发布我工作的所有功能。
更新信息:ithis lab只能使用c ++ 14,不能包含任何其他lib。 int值是用字符串写的,需要比较哪个更大。假设除了数字
之外没有任何否定和任何字母我的头文件的某些部分
#include <cstring>
#include <iostream>
namespace CS170
{
class BigNum
{
public:
/* Constructor of BigNum object.
Takes in a character string and
constructs a BigNum */
BigNum(const char * rhs = "0");
/* one of rule of 3 need destructor */
~BigNum();
/* Return a character pointer pointing
to the start of the array representing the big num */
const char * toString() const;
/* Return how many digits the number has */
size_t getNumDigits() const;
BigNum & operator =(const BigNum & rhs);
private:
size_t len;
char* num;
};
}
bool operator >(const CS170::BigNum &lhs, const CS170::BigNum &rhs);
CPP
namespace CS170
{
BigNum::BigNum(const char * rhs )
:len{strlen(rhs)}, num{new char[len+1]}
{
strcpy(num,rhs);
}
BigNum::~BigNum()
{
}
const char * BigNum::toString() const
{
return num;
}
size_t BigNum::getNumDigits() const
{
return len;
}
}
bool operator >(const CS170::BigNum &lhs, const CS170::BigNum &rhs)
{
CS170::BigNum left_value{lhs};
CS170::BigNum right_value{rhs};
std::cout << std::endl;
std::cout << left_value.toString() << " " << right_value.toString() <<
std::endl;
/*this don't work for comparing**/
if(left_value.toString() > right_value.toString())
return true;
else
return false;
}
答案 0 :(得分:2)
left_value.toString() > right_value.toString()
这不符合你的想法。 toString()
返回const char*
,指向某些数据的指针。正式地,>
在你的情况下的行为是 undefined ,因为指针不是同一个数组的一部分,即使它们是,结果也不依赖于字符串内容。
要检查字符串的词典语法顺序,您应该使用正确的工具,例如std::string::operator>
:
std::string lhs_string{left_value.toString()};
std::string rhs_string{rght_value.toString()};
if (lhs_string > rhs_string)
// ...
// note: here you could simply do return lhs_string > rhs_string;
如果您正在使用最新的编译器并且C ++ 17是一个选项,您也可以使用这些工具而不复制数据:
#include <string_view>
const char* lhs = "programming";
const char* rhs = "language";
std::string_view lhs_string{lhs};
std::string_view rhs_string{rhs};
lhs_string>rhs_string // lexicogrammatical order
答案 1 :(得分:1)
const char*
无法按照您尝试的方式进行比较。您必须使用strcmp
。示例用法如下:
if (strcmp(left_value.toString(), right_value.toString()) > 0)
{
return true;
}
该功能的最后一部分甚至可以简化为:
return strcmp(left_value.toString(), right_value.toString()) > 0;
答案 2 :(得分:0)
几乎就在那里,但如果比较11&gt;我不工作2,因为仍然只读取第一个字符串。
bool operator >(const CS170::BigNum &lhs, const CS170::BigNum &rhs)
{
CS170::BigNum left_data{lhs};
CS170::BigNum right_data{rhs};
int result = strncmp(left_data.toString(), right_data.toString(),20);
return result > 0;
}