我试图通过“==”运算符比较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 - 这就是它失败的地方。
答案 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。