程序运行时出错
#include<iostream>
#include<string>
using namespace std;
void StrAftNcpy(char *a,char *b,int n)
{
int i,j=0;
for(i=n-1;b[i]!='\0';i++,j++)
a[j]=b[i];
a[j]=0;
}
int main()
{
char* str1,*str2;
int n,m;
cout<<"一个字符串从第n个字符开始的所有字符复制到另一个字符串中\n";
cout<<"请输入源字符串长度:\n";
cin>>m;
if(m<0) {cout<<"艹死你个SB\n";return 0;}
str2=new char[m];
cout<<"请输入源字符串:\n";
fflush(stdin);
cin.getline(str2,m);
str2[m-1]='\0';
while(1)
{
cout<<"请输入n值:\n";
cin>>n;
if(n<0||n>m)
cout<<"输入错误,0≤n≤"<<m<<",";
else
break;
}
str1=new char[n];
StrAftNcpy(str1,str2,n);
cout<<str1<<endl;
delete []str1;
delete []str2;
system("pause");
}
在运行时弹出如下错误框,但点忽略后能正常运行。
当输入字符数>=m时,while会进入死循环,如下图:
在vc6和vs2010里运行都一样。
为什么会这样?应如何解决?
[解决办法]
第1张图的解释:
str1=new char[n];
这里应该是str1=new char[m-n+1];
[解决办法]
void StrAftNcpy(char *a,char *b,int n)
{
int i,j=0;
for(i=n-1;b[i]!='\0';i++,j++) //这里楼主想做什么?str1=new char[n];一共就申请了那么点空间你一
a[j]=b[i]; //下就弄到尾了。要么i=0;如果逆序的话,后面改成i--; 还有,你的
a[j]=0; //n<=m,b[m-1]='\0',for里面的约束条件只有当n==m时才成立。
} //a[j]=0是不对的,这里的j==n了,越界了。应该是a[j-1].
我自己该的:
void StrAftNcpy(char *strDes, char * strSc, int n)
{
int i,j=0;
for(i=0; i<n; ++i,++j)
{
strDes[j]=strSc[i];
}
strDes[j-1] = '\0';
}// 这个是正序的拷贝。
还有那个循环是这样的,是getline函数的一个弊端(虽然很省事),如果你用这个函数,那么你输入的m值必须要比你输入的字符数大。否则,后面的输入都无效了。加fflush(stdin)也没用。
[解决办法]
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
程序运行时失误
程序运行时出错#includeiostream#includestringusing namespace stdvoid StrAftNcpy(char *a,char *b
