从字符串对象中去除标点符号的问题

小湿哥 2011-09-15 04:41:50
我写的code,运行提示 下标溢出,但是我还没看出来哪里溢出了,请大神们看看

#include <iostream>
#include <string>
#include <cctype>
using std::cout;
using std::cin;
using std::endl;
using std::string;
int main()
{
string s,a;
int h[20],i,j=0,k=0;
cin >> s;
memset(h,0,sizeof(h));
for(i=0,j=0;i!=s.size();++i)//---------------------记录符号字符位置
{
if(ispunct(s[i])){h[j]=i;++j;}
}
for(i=0,j=0;(i+j)!=s.size();++i)//----------------赋值给新字符串,跳过其中的符号
{
if(i==h[j])++j;
a[i]=s[i+j];
}
cout << a << endl;
return 0;
}
...全文
366 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 zhao4zhong1 的回复:]
多用>,>=,<,<=
少用==,!=
[/Quote]
当然只对纯数值比较而言。
赵4老师 2011-09-16
  • 打赏
  • 举报
回复
多用>,>=,<,<=
少用==,!=
tr3301103 2011-09-16
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main()
{
string s;
char a[1000];
char b;
int h[20],i,j,k=0;
cin >> s;
memset(h,0,sizeof(h));
for(i=0,j=0;i!=s.size();++i)//---------------------记录符号字符位置
{
if(ispunct(s[i]))
{
h[j]=i;
++j;
}
}
for(i=0,j=0;i!=s.size();++i)//----------------赋值给新字符串,跳过其中的符号
{
if(i==h[j])
{
++j;
}
else
{
a[k]=s[i];
k++;
}
}
a[k]='\0';
cout << a << endl;

return 0;
}
楼主确定数组h[20]够用?
turing-complete 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jacicson1987 的回复:]

有木有大神 能直接在我源代码上 修改一点,直接运行成功的?
[/Quote]

有必要为它花这么多精力嘛
nice_cxf 2011-09-16
  • 打赏
  • 举报
回复
估计把(i+j)!=s.size();改成<大概就没问题了,这种问题自己DEBUG单步一下就可以发现的
小湿哥 2011-09-16
  • 打赏
  • 举报
回复
怒挽。。。
小湿哥 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 mougaidong 的回复:]
引用 10 楼 jacicson1987 的回复:

哦?我看C++ primer里面 for循环都是!= 作为判断条件的。。


赵老师早就说过,不要相信回帖。
[/Quote]

你太幽默了。。。结贴了。
小湿哥 2011-09-16
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main()
{
string s;
char a[100];
int h[20],i,j=0,k=0;
cin >> s;
memset(h,0,sizeof(h));
memset(a,0,sizeof(a));
for(i=0,j=0;i!=s.size();++i)//---------------------记录符号字符位置
{
if(ispunct(s[i])){h[j]=i;++j;}
}
for(i=0,j=0;(i+j)!=s.size();++i)//----------------赋值给新字符串,跳过其中的符号
{
while(i+j==h[j])
{
++j;
}
a[i]=s[i+j];
}
cout << a << endl;
return 0;
}


终于改好了。
发现溢出的原因有两个:1,新字符串a要用 字符数组a[100],用 string a 不行。
2,赋值给新字符串过程中算法有问题,导致溢出。

两个都改了, 就OK了。。感谢大家!!。..
nice_cxf 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jacicson1987 的回复:]
哦?我看C++ primer里面 for循环都是!= 作为判断条件的。。
[/Quote]
那里边多半都是指针或迭代器,当然只能用!=,for循环用!=也不是不行
但你代码里面用(i+j)!=s.size();由于i,j可能同时+1导致这里永远也进不来导致越界
turing-complete 2011-09-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jacicson1987 的回复:]

哦?我看C++ primer里面 for循环都是!= 作为判断条件的。。
[/Quote]

赵老师早就说过,不要相信回帖。
小湿哥 2011-09-16
  • 打赏
  • 举报
回复
哦?我看C++ primer里面 for循环都是!= 作为判断条件的。。
小湿哥 2011-09-15
  • 打赏
  • 举报
回复
有木有大神 能直接在我源代码上 修改一点,直接运行成功的?
cocoabird 2011-09-15
  • 打赏
  • 举报
回复
if(i==h[j]);
a[i]=s[i+j];
j++;
Ol_lO 2011-09-15
  • 打赏
  • 举报
回复

if(i==h[j])++j;

++j有可能使i+j越界
turing-complete 2011-09-15
  • 打赏
  • 举报
回复
#include <iostream>
#include <string>

using std::cout;
using std::cin;
using std::endl;
using std::string;

int main()
{
string input_str, result_str;
cin >> input_str;
unsigned int len(input_str.size());
for (unsigned int i(0); i < len; ++i)
{
if (!ispunct(input_str[i]))
{
result_str.append(1, input_str[i]);
}
}
cout << result_str << endl;
return 0;
}

64,637

社区成员

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

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