tolower()?

C卡嘉 2014-04-05 06:25:26

//a.cc
#include <iostream>

int main()
{
using std::cin;
using std::cout;
using std::endl;
using std::string;

string s("aBcDEFg");
for(string::size_type i=0; i<s.size(); i++)
s[i]=tolower(s[i]);
cout<<s<<endl;

return 0;
}




 
//b.cc
#include <iostream>

int main()
{
using std::cin;
using std::cout;
using std::endl;
using std::string;

string s("aBcDEFg");
string sp;

for(string::size_type i=0; i<s.size(); i++)
sp[i]=tolower(s[i]);
cout<<sp<<endl;

return 0;
}



----------------------------------------------------------------
问题:
1.为什么,程序b.cc是错误呢?
说说原因!

...全文
194 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
C卡嘉 2014-04-09
  • 打赏
  • 举报
回复
b.cc,也对。
ken_scott 2014-04-08
  • 打赏
  • 举报
回复
string sp; ===》string sp(s.size(), '\0');
jiandingzhe 2014-04-06
  • 打赏
  • 举报
回复
string的[]函数不是autovivfy的,它不会自动扩充string的尺寸。所以,你写越界了。
f_liu 2014-04-06
  • 打赏
  • 举报
回复
应该是sp没有分配内存空间吧。。。应该要初始化一下
荔枝树_12w 2014-04-06
  • 打赏
  • 举报
回复
string为空
lm_whales 2014-04-06
  • 打赏
  • 举报
回复
string的储存字符的容量是一定的,operator [] 不会自动扩充string容量,要用其他方法扩充。 operator+,resize(),等等都可以扩充string对象的容量。 reserve只是修改保留的容量,这个容量是用来减少分配次数的,不是字符串实际字符个数 reserve,只要实际字符个数,不超过保留的容量-1,就不会重新分配内存。 resize()等才会真正扩容,同时修改string的字符个数。
x363635334 2014-04-06
  • 打赏
  • 举报
回复
sp没开辟内存
C卡嘉 2014-04-05
  • 打赏
  • 举报
回复
string类型对象,已初始化了。 才可以用下标操作符[ ]。 对么?
苍蝇①号 2014-04-05
  • 打赏
  • 举报
回复
先扩大空间再用数组下标,否则越界错误sp.reserve(s.size())
turing-complete 2014-04-05
  • 打赏
  • 举报
回复
您试试不就知道了嘛
C卡嘉 2014-04-05
  • 打赏
  • 举报
回复
引用 1 楼 mougaidong 的回复:
sp中没有足够的元素,会造成访问越界。 sp[i]=tolower(s[i]); 这一句换成 sp += sptolower(s[i]);
这个程序,用=和+=,有区别么?
turing-complete 2014-04-05
  • 打赏
  • 举报
回复
sp中没有足够的元素,会造成访问越界。 sp[i]=tolower(s[i]); 这一句换成 sp += sptolower(s[i]);

65,208

社区成员

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

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