string 与 char 的转换问题

lily604 2008-03-06 09:53:31
我写了段小程序,为什么会出现——file1.exe 遇到问题需要关闭。我们对此引起的不便表示抱歉。这样的问题呢
string s;
char sort[]="abcd";

for(int i=0;i<5;i++)

s[i]=sort[i];
for(int j=0;j<5;j++)
cout<<s[j];


请大家帮着分析一下啊
...全文
114 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
abupie 2008-03-07
  • 打赏
  • 举报
回复
用string::resize() 或者 string::append() 或者 string::assign()都可以解决。
附,string 函数列表

函数名 描述
begin 得到指向字符串开头的Iterator
end 得到指向字符串结尾的Iterator
rbegin 得到指向反向字符串开头的Iterator
rend 得到指向反向字符串结尾的Iterator
size 得到字符串的大小
length 和size函数功能相同
max_size 字符串可能的最大大小
capacity 在不重新分配内存的情况下,字符串可能的大小
empty 判断是否为空
operator[] 取第几个元素,相当于数组
c_str 取得C风格的const char* 字符串
data 取得字符串内容地址
operator= 赋值操作符
reserve 预留空间
swap 交换函数
insert 插入字符
append 追加字符
push_back 追加字符
operator+= += 操作符
erase 删除字符串
clear 清空字符容器中所有内容
resize 重新分配空间
assign 和赋值操作符一样
replace 替代
copy 字符串到空间
find 查找
rfind 反向查找
find_first_of 查找包含子串中的任何字符,返回第一个位置
find_first_not_of 查找不包含子串中的任何字符,返回第一个位置
find_last_of 查找包含子串中的任何字符,返回最后一个位置
find_last_not_of 查找不包含子串中的任何字符,返回最后一个位置
substr 得到字串
compare 比较字符串
operator+ 字符串链接
operator== 判断是否相等
operator!= 判断是否不等于
operator< 判断是否小于
operator>> 从输入流中读入字符串
operator<< 字符串写入输出流
getline 从输入流中读入一行
fish6344 2008-03-07
  • 打赏
  • 举报
回复
不好意思,特别更正7楼中的'size_t'应为'std::string::size_type'!

谢谢!
lily604 2008-03-06
  • 打赏
  • 举报
回复
非常感谢大家的积极回答
fish6344 2008-03-06
  • 打赏
  • 举报
回复
对你的代码稍作润色,再注释如下:

int main()
{
string s;//调用缺省构造函数,构造了1个字符缓冲区为0的string,等价于"",即1个NULL字符串!

//我润色的:
cout << static_cast<long>(s.size()) << endl;//输出0,以证上面注释!

   //我润色的:
string my_s("abcd");//调用转换构造函数,构造了1个字符缓冲区为4的string,等价于"abcd"!
cout << static_cast<long>(my_s.size()) << endl;
//输出4,以证上面注释。这是因string不同于C风格字符串,无需一个结束符'\0';

  char sort[]="abcd";

  /* 在如下语句's[i]'中,i值大于0则下标越界!C++标准把string纳入STL,并允许其为求效率而不作
越界检查,故不会抛出out_of_range,仅定义无效索引的使用有不可预知的行为!
(见《C++标准程库》page487)故于本程序,在我的gcc、vc7.0及BC上不会出现运行时错!
*/ 
for(int i=0;i <5;i++) s[i]=sort[i];//使用无效索引值;

for(int j=0;j <5;j++) cout << s[j];//上述3种编译器输出无错假象:"abcd"!
cout << endl;

cout << static_cast<long>(s.size()) << endl;//输出0,表示s的有效字符串长度仍为0!

_PAUSE;
}
yuyunliuhen 2008-03-06
  • 打赏
  • 举报
回复
4
czlc 2008-03-06
  • 打赏
  • 举报
回复
string s; // 声明的时候没有分配那么多空间,具体多少忘了,可以size一下看看:)
星羽 2008-03-06
  • 打赏
  • 举报
回复


string s;

这个时候s是没有分配空间的,也就是size = 0,所以你不能用 s[i] 取其元素

改法

1)

#include "iostream"
#include "string"
using namespace std;

int main()
{
string s;
char sort[] = "abcd";

s = sort;

for(int j = 0;j < 5; j++)
cout<<s[j];


return 0;
}


2)


#include "iostream"
#include "string"
using namespace std;

int main()
{
string s;
char sort[] = "abcd";

for (int i = 0; i < 5; i++)
s.push_back(sort[i]);

for(int j = 0;j < 5; j++)
cout<<s[j];


return 0;
}


3)

int main()
{
string s(128, 0);
char sort[] = "abcd";

for (int i = 0; i < 5; i++)
s[i] = sort[i];

for(int j = 0;j < 5; j++)
cout<<s[j];


return 0;
}






hastings 2008-03-06
  • 打赏
  • 举报
回复
string s; 
char sort[]="abcd";
s=sort;
for(int j=0;j <5;j++)
cout<<s[j];
baihacker 2008-03-06
  • 打赏
  • 举报
回复
要赋值的话直接用 s = sort;就OK了
baihacker 2008-03-06
  • 打赏
  • 举报
回复

string s;
char sort[]="abcd";
s.resize(5);
for(int i=0;i <5;i++)
s[i]=sort[i];
for(int j=0;j<5;j++)
cout << s[j];

64,648

社区成员

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

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