改善一个劣质的C++代码

billow_zhang 2009-07-02 09:32:41
下面是一个我在一个应用系统中发现的我认为很丑陋的一段C++代码.显然,代码的意图是将string中的内容变成相应的小写字母.请大家指出它的问题之所在,并给出改善后的代码.我自已已经有了一个答案,只用一条语句就能实现这个功能.待两日后我给出我的答案.但然,也许你的答案比我的更好.

void IniReader::string_lower(string& str)
{
int size=str.length();
string temp;
char c;
for(int i=0;i<size;i++)
{
c=str.at(i);
if(c>=65&&c<=90)
{
c+=32;
}
else
{
continue;
}
temp=c;
str.replace(i,1,temp);
}
}
...全文
32 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
billow_zhang 2009-07-03
  • 打赏
  • 举报
回复
superyys 2009-07-03
  • 打赏
  • 举报
回复
楼主比较自信....
Walf_ghoul 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Vegertar 的回复:]
很劣质吗?无非不够幽雅而已!而且对于非英文字符仍然保持不变,不会发生无大写字母转换的异常。
复杂度仍是 O(str.length()) , 莫非楼主还能更快?!
[/Quote]
给出的方法虽然不是好的,但也有其值得肯定的地方啊。。。
Walf_ghoul 2009-07-02
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 taodm 的回复:]
算了,贴段boost的to_lower吧。

template <typename CharT>
struct to_lowerF : public std::unary_function <CharT, CharT>
{
// Constructor
to_lowerF( const std::locale& Loc ) : m_Loc( Loc ) {}

// Operation
CharT operator ()( CharT Ch ) const
{
#…
[/Quote]
还是这个牛xx啊。。。。
amossavez 2009-07-02
  • 打赏
  • 举报
回复

]#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
string str="JIuyIUhjkHUY";
transform(str.begin(),str.end(),str.begin(),tolower);
cout<<str;
return 0;
}
amossavez 2009-07-02
  • 打赏
  • 举报
回复
[code=C/C++]
]#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
string str="JIuyIUhjkHUY";
transform(str.begin(),str.end(),str.begin(),tolower);
cout<<str;
return 0;
}
[/code
Vegertar 2009-07-02
  • 打赏
  • 举报
回复
很劣质吗?无非不够幽雅而已!而且对于非英文字符仍然保持不变,不会发生无大写字母转换的异常。
复杂度仍是 O(str.length()) , 莫非楼主还能更快?!
taodm 2009-07-02
  • 打赏
  • 举报
回复
算了,贴段boost的to_lower吧。

template<typename CharT>
struct to_lowerF : public std::unary_function<CharT, CharT>
{
// Constructor
to_lowerF( const std::locale& Loc ) : m_Loc( Loc ) {}

// Operation
CharT operator ()( CharT Ch ) const
{
#if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x564) && !defined(_USE_OLD_RW_STL)
return std::tolower( Ch);
#else
return std::tolower<CharT>( Ch, m_Loc );
#endif
}
private:
const std::locale& m_Loc;
};

// Transform a range (in-place)
template<typename RangeT, typename FunctorT>
void transform_range(
const RangeT& Input,
FunctorT Functor)
{
std::transform(
::boost::begin(Input),
::boost::end(Input),
::boost::begin(Input),
Functor);
}

template<typename WritableRangeT>
inline void to_lower(
WritableRangeT& Input,
const std::locale& Loc=std::locale())
{
::boost::algorithm::detail::transform_range(
as_literal(Input),
::boost::algorithm::detail::to_lowerF<
typename range_value<WritableRangeT>::type >(Loc));
}
maosher 2009-07-02
  • 打赏
  • 举报
回复

#include <cctype>
void IniReader::string_lower(string& str)
{
for (string::size_type i=0; i!=str.size();++i)
{
str[i] = tolower(str[i]);
}
}
liao05050075 2009-07-02
  • 打赏
  • 举报
回复
#include<cstring>

void IniReader::string_lower(string& str)
{
strlwr(str.c_str());
}
大前置 2009-07-02
  • 打赏
  • 举报
回复
transform(s.begin(),s.end(),s.begin(),tolower);
萧霖 2009-07-02
  • 打赏
  • 举报
回复
一条语句就搞定?

64,637

社区成员

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

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