c ++运算符重载与字符串比较

时间:2018-02-09 14:53:38

标签: c++ operator-overloading

你好,我的学校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;
}

3 个答案:

答案 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

live demo

答案 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;

 }