关于用sort()不区别大小写的字符串排序

strikerzgq 2005-11-12 01:35:44
关于用sort()不区别大小写的字符串排序
但是sort里是区别大小写的,自己写了个比较函数,全部按小写排序,但是不成功
请哪位高人指点一下可以吗?!小弟在这里叩谢了! 谢谢
bool less_lower(const string &str1, const string &str2)
{
locale loc("German_Germany");
return tolower(*str1 ) < tolower(*str2 );
}
sort(AllWords.begin(), AllWords.end(), less_lower);
...全文
992 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
mhisky 2006-05-10
  • 打赏
  • 举报
回复
mark
nodummy 2005-11-13
  • 打赏
  • 举报
回复
某些睁着眼睛说瞎话的人请把代码好好看看,然后再说话。靠贬低别人的代码抢分是很无耻的行为,更何况你自己的代码才是有问题的。stricmp在M$的平台上叫做_stricmp,在某些平台里面根本没有这个函数,因为其本身并非ISO/IEC 9899-1999中规定的标准库的成员(C++更没有定义这样一个东西。

对于某些的人,我不得不多说几句。<=是我故意为之,根本就不是错误,这样的效率比<然后再去判断要高。C-Style string最后一个字符是'\0',无论什么,这个字符仍然按照一般的规矩去进行比较就可以了,完全无需什么另外的处理。最后直接return true或者return false都是无所谓的,因为两个字符串根本就是相等的。
fangrk 2005-11-13
  • 打赏
  • 举报
回复
自己去看这个结果:

string sb_str("\0asdf");
cout<<sb_str;
///
没有显示内容在于你的传递的参数不对.str("\0asd")等价于str("");

std::string可以包含'\0',即使包含了'\0',仍然可以正确显示内容。
#include <string>
#include <iostream>
using namespace std;
int main()
{
string a("aa");
a+='\0';
a+="bb";
cout<<a;
}
///////////////////////////////////////////
string和c-style string是两码事情。

“'\0'就是字符串的结束,何来string包含'\0'一说?你的这个代码纯粹属于找茬。”

行了,讨论到此为止。
nodummy 2005-11-13
  • 打赏
  • 举报
回复
再说了,对于你的stricmp,也没有办法正确识别出现了'\0'的作为容器的string
nodummy 2005-11-13
  • 打赏
  • 举报
回复
除非是wstring,否则按照C-Style string的定义,'\0'就是字符串的结束,何来string包含'\0'一说?你的这个代码纯粹属于找茬。

自己去看这个结果:

string sb_str("\0asdf");
cout<<sb_str;

不知道你能在什么编译器下面找到能产生输出的么?对于存在了'\0'为内容的“字符串”(都不知道是否还可以称之为字符串)来说,进行比较还有什么意义?纯粹把string当作容器也就算了,只要你还在使用标准库,修改某一个标准库中特定实体的上下文中的意义根本就是不知所谓的古怪行为。

楼主在标题里面就已经限定了是字符串,而不是将string作为字节流的二进制容器,又在代码里面限定了是string而不是wstring(其实对于wstring来说,只要用wchar_t来迭代,也不会出现问题),只能对你改变原贴意义强求一个符合情况来为自己辩解的行为表示遗憾
fangrk 2005-11-13
  • 打赏
  • 举报
回复
楼上的说话不要这么难听,我觉得你的代码有错误难道就是无耻的行为?这算是贬低?

我现在仔细看了你的代码后发现你的代码还是有问题的,虽然i<=len是故意的,你用下面的代码来测试一下你的正确无误的函数:
int main()
{
string s1("abcde"),s2("ABCDE");
cout<<less_lower(s1,s2)<<'\n'<<less_lower(s2,s1)<<'\n';
s1+='\0';
s1+='A';
cout<<less_lower(s1,s2)<<'\n'<<less_lower(s2,s1);
}
当然,我的代码也有点问题。我在Borland C++ Builder 6的帮助中看到stricmp在win32/C/C++中都是可移植的,所以我才写出来。

我没有考虑string本身可以包含'\0',现修正自己的错误:
bool less_lower(const string &str1, const string &str2)
{
const size_t MinLen=std::min(str1.size(),str2.size());
for(size_t i=0;i<MinLen;++i){
if(tolower(str1[i])!=tolower(str2[i])) return tolower(str1[i])< tolower(str2[i]);
}
return str1.size()<str2.size();
}

拜托以后火气小一点!
strikerzgq 2005-11-12
  • 打赏
  • 举报
回复
今天学到了很多东西 谢谢各位!
foochow 2005-11-12
  • 打赏
  • 举报
回复
effective stl
fangrk 2005-11-12
  • 打赏
  • 举报
回复
nodummy(三甲 之 Linux/Unix里面甭给我分,谁给我分我和谁急)
的代码有bug,i<=len应该是i<len,而且for结束后不应该是简单的return true


int stricmp(const char *s1, const char *s2);

Return Value
If s1 is... stricmp returns a value that is...
less than s2 < 0
the same as s2 == 0
greater than s2 > 0

bool less_lower(const string &str1, const string &str2)
{
return stricmp(str1.c_str(),str2.c_str())<0;
}
guyanhun 2005-11-12
  • 打赏
  • 举报
回复
或者先全部转换成小写的字母,再用sort函数
Mr_Yang 2005-11-12
  • 打赏
  • 举报
回复
学习
strikerzgq 2005-11-12
  • 打赏
  • 举报
回复
谢谢楼上的几位!
qhfu 2005-11-12
  • 打赏
  • 举报
回复
bool less_lower(const string &str1, const string &str2)
{
return _stricmp(str1.c_str(),str2.c_str());
}
nodummy 2005-11-12
  • 打赏
  • 举报
回复
完整的例子

#include <algorithm>
#include <vector>
#include <iostream>
#include <string>
using namespace std;
bool less_lower(const string &str1, const string &str2)
{
int len = str1.length() < str2.length() ? str1.length() : str2.length();
for ( int i = 0; i <= len; i++)
{
if (tolower(str1[i]) != tolower(str2[i]))
{
return tolower(str1[i]) < tolower(str2[i]) ? true : false;
}
}
return true;
}

int main(void)
{
vector<string> vec;
vec.push_back("asdf");
vec.push_back("ASDF");
vec.push_back("BCDE");
vec.push_back("adfd");
vec.push_back("asdfg");
vec.push_back("asdf");
sort(vec.begin(), vec.end(), less_lower);
for (int i = 0; i < vec.size(); i++)
cout << vec[i] << '\t';
}
nodummy 2005-11-12
  • 打赏
  • 举报
回复
给你一个可用的版本……

bool less_lower(const string &str1, const string &str2)
{
int len = str1.length() < str2.length() ? str1.length() : str2.length();
for ( int i = 0; i <= len; i++)
{
if (tolower(str1[i]) != tolower(str2[i]))
{
return tolower(str1[i]) < tolower(str2[i]) ? true : false;
}
}
return true;
}
strikerzgq 2005-11-12
  • 打赏
  • 举报
回复
那个函数该怎么写啊 请楼上的赐教!
nodummy 2005-11-12
  • 打赏
  • 举报
回复
这是在干啥?纯粹按照整个字符串的第一个字符的大小进行比较?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧