null终结符在比较时给字符串长度带来麻烦

时间:2010-09-22 00:24:33

标签: c++ string comparison

我试图通过“==”运算符比较2个字符串。 当我打印字符串时两者都是相同的。

但是一个的长度加一,我认为它是空终止符。

比较??

时忽略这个的任何方法

谢谢!

City* Adjutancy::FromStringToCity(string cityName) const
{
 for (list<City*>::const_iterator it=m_citiesList.begin();it!=m_citiesList.end();it++)
  if ((*it)->GetCityName()==cityName) //this fails
   return *it;
 return NULL;
}

string GetCityName() const {return m_cityName;}

创建

private: 
 string m_cityName; 

FromStringToCity(toAdd->GetCityOfBase());

string Base::GetCityOfBase() const
{
 return m_baseCity;
}

private:
  string m_baseCity;

这就是全部,BTW适用于Windows中的Visual Studio,但现在我将它转移到Linux Kate - 这就是它失败的地方。

4 个答案:

答案 0 :(得分:3)

如果这些是引号或字符数组中的字符串文字,则它们不会进行比较,因为您要比较指针地址,而不是字符串本身。如果它们是std::string,它应该可以正常工作。

如果它们都是std :: string且一个比另一个长,我们需要看看你是如何分配值来检测问题的。

编辑:在阅读了大量评论后,我相信您的额外字符不是空终结符,而是换行符。在阅读文件时,您需要将其剥离。

答案 1 :(得分:2)

我猜你正在读一个带回车字符的文件。在Windows中,回车符/换行符组合(ASCII 13/10十进制)分隔文本行。在Linux / UNIX上,只需要换行。当您在Linux上读取字符串时,它将在字符串中保留回车符,而不是像在Windows上那样剥离它。您需要检查最后一个字符是否为回车符 - 如果是,则将其删除:

if (str.size() and str[str.size() - 1] == '\r')
    str.erase(str.size() - 1);

BTW /当您使用回车符打印(到终端设备)时,只需在显示字符串后将光标移回左侧列。如果你在之前和之后加上一个引号,例如

,就更容易发现
std::cout << "my_string \"" << my_string << "\"\n";

然后如果my_string持有“text \ r \ n”,你会看到......

"y_string "text

......怪异的响起警钟。

答案 2 :(得分:2)

现在您已经知道了(显然)处理过的直接问题,请允许我建议您丢弃该代码并将其完全替换为其他内容。

特别是,您似乎正在使用std::list来实现真正意图成为地图的内容 - 即,让您按名称查找城市。标准库已经有一个更高效,更易于使用的地图(名为std::map)。链接列表可能不是手头工作最糟糕的数据结构,但至少根据您所展示的内容,它肯定是一个最糟糕的选择

从外观上看,你可以使用:

std::map<std::string, City> cityList;

可能

std::map<std::string, City *> cityList;

并且好多了。搜索将是对数而不是线性(即,通常相当快一些,尤其是对于大量城市而言),并且管理通常会更清晰和简单(例如,添加有关城市的信息将类似于:

City chicago;
// fill in data about Chicago

cityList["Chicago"] = chicago;

答案 3 :(得分:1)

strcmp(a.c_str(), b.c_str()) == 0

这会将它们作为空终止的c字符串进行比较

实际上你应该在创建字符串时删除尾随的NULL。