c++中出现Debug Assertion Failed!错误。。

题目要求是将输入的只有*和字母的字符串中,*移动到字符串后面。。。我这样做了,然后出现了上述的错误提示
#include<iostream>
#include<string>
using namespace std;
void fun(string s)

{
int i=0;
int j;
int k=0;
while(s[k]!='\0')
{ if(s[i]=='*')
{
for(j=0;s[j+1]!='\0';j++)s[j]=s[j+1];
s[j+1]='*';
k++;
}
else {i++;k++;}
}

}
void main()
{
string s1;
cout<<"请输入仅由*和字母组成的字符串:\n";
cin>>s1;
cout<<"初始字符串为:"<<s1<<endl;
fun(s1);
cout<<"调序后字符串为:"<<s1<<endl;
}

#include<iostream>
#include<string>
using namespace std;
void fun(string &s)

{
/* nCurPos:当前遍历到的位置 nCount:字符'*'的个数 nTempPos:实际就是nCurPos + nCount */
int nCurPos = 0, nCount = 0, nTempPos = 0;
/* 用于存储遍历到的'*' */
char *chTemp = new char[s.length() + 1];
memset(chTemp,0,s.length() + 1);

/* 开始遍历 */
while(nCurPos < s.length())
{
/* 遇到'*' */
if ('*' == s[nCurPos])
{
/* 可能有多个连续的'*' */
nTempPos = nCurPos;
do 
{
/* 将连续的'*'拷贝出来,并计数 */
memcpy(chTemp + nCount,&s[nTempPos],1);
nCount++;
} while ('*' == s[++nTempPos]);

/* 如果获取到的已经是字符串末尾的那段'*',则表示已经调整完毕,无需继续 */
if (nTempPos == s.length())
{
break;
}

/* 确保有'*'待调整 */
if ('\0' != *chTemp)
{
/* 获取当前字符串长度 */
int nTempLen = s.length();

/* 将'*'后面的字符串往前挪动 */
s.replace(nCurPos,nTempLen - nCurPos - 1,s,nTempPos,nTempLen - nTempPos);

/* 将前面遍历拷贝出来的'*'放在字符串末尾 */
s.replace(nCurPos + nTempLen - nTempPos,strlen(chTemp) + 1,chTemp,0,strlen(chTemp) + 1);

/* 临时计数器清空,进入下一轮遍历 */
nCount = 0;
memset(chTemp,0,strlen(chTemp));
nCurPos++;
}
else
{
break;
}
}
else
{
/* 当前的字符不是'*',继续往下走 */
nCurPos++;
}
}

/* 释放内存并将其指向NULL防止内存泄露及野指针 */
delete[] chTemp;
chTemp = NULL;
}
void main()
{
string s1;
cout<<"请输入仅由*和字母组成的字符串:\n";
cin>>s1;
cout<<"初始字符串为:"<<endl<<s1<<endl;
fun(s1);
cout<<"调序后字符串为:"<<s1<<endl;
}

小哥,你的代码不太好改,就直接用我自己的想法来实现了,应该是可行的,自己测试下吧

温馨提示:内容为网友见解,仅供参考
第1个回答  2014-03-24
那个错误是访问了越界内存,(s[j+1]='*';这句就是问题所在结果是你的str里没有了‘\0’结尾符)楼主的for循环可以这样改
for(j=i ;s[j+1] != '\0';j++)
{
s[j]=s[j+1];

s[j+1]='*';

}
这样才行。本回答被网友采纳
相似回答