问题描述
- C++编译没错误,运行停止工作,菜鸟求指点
-
#include
#include
using namespace std;int main()
{string ch = ""; char*p=&ch[0]; cout <<"input cipher code:"; gets(p); cout <<"cipher code:"<<ch<<endl; int j=0; for(j=0;j<=ch.size()-1;j++) { if(ch[j]<='A'&&ch[j]>='Z') ch[j]=155-ch[j]; else if (ch[j]<='a'&&ch[j]>='z') ch[j]=219-ch[j]; } cout <<"original text:"; cout <<ch<<endl; return 0;
}
解决方案
ch是一个常量,不要试图改变它,new一个内存,用strcpy拷贝出来。
解决方案二:
首先说一下,抱歉今天没有详细调试,接着楼上的说,主要的问题时使用string的方法。请一定记住,C++中任何类型都是一种类,操作的时候也是对象为主,即便基本的数据类型,比如整形,也是一种特殊的类。
以下是稍作修改的代码,具体的含义我在其中给出了注释。
//
// 帖子中的include 遗漏了包含的库,我根据理解自己补充了。
//
#include
#include
using namespace std;
int main()
{
string ch; //ch作为string对象有缺省的构造函数,不用刻意初始化。
//char*p=&ch[0]; //此处一定不要直接去ch的地址,因为ch是一个对象,所以此处的操作变为了取ch这个对象的地址;之所以在下文中可以用[ ](即索引操作符)访问string中的每一个字符,是因为string类已经重载了该操作符。但是,请特别注意此处的[]已经不是基本类型使用的索引操作符了,因为它不再是简单的返回某个元素的地址。
cout <<"input cipher code:";
// gets(p); //这是C中的函数,建议不要与字符串混用。C++中单独提供string类的用途就是能管理字符串,尽量不出现缓冲区溢出等直接访问字符串地址时出现的负面效果。
getline(cin,ch) ; //请使用getline这个函数进行输入流操作。
cout <<"cipher code:"<<ch<<endl;
int j=0;
for(j=0;j<=ch.size()-1;j++)
{
if(ch[j]<='A' && ch[j]>='Z')
ch[j]=155-ch[j];
else if (ch[j]<='a' && ch[j]>='z')
ch[j]=219-ch[j];
}
cout <<"original text:"
<<ch<<endl;
return 0;
}
另,上述的程序似乎逻辑还有些问题,我今天手头还有事,没来得及仔细看,如果需要可以留言,改天再讨论。
解决方案三:
string不是简单的char类型数组,不能直接char*p=&ch[0]; 这样取到的指针不是真正用于存储数据的地址指针。而且你拿到对应指针,然后直接往里面填充数据也是不对的吧,这样string的管理会有问题吧
解决方案四:
可以运行,但是for循环只能执行一次,为什么啊