关于字符串的问题 请教各位 谢谢!!!!!!!

超gogo 2009-05-15 09:30:12
我想编一个程序,用string型或者char 指针来存储,但是用char型来使用。

但是下面的程序会报错:


char* m="afdsfdsfdsfds"
for(i=0;i<20;i++)
cout<<m[i];


不用数组,也不用动态分配内存,就是想 定义一个字符串,然后用char型来使用

希望大家按照我的思路来,谢谢!!!!!
...全文
185 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangch_nhcmo 2009-05-16
  • 打赏
  • 举报
回复

#include<iostream>
using std::cin;
using std::cout;
using std::endl;

typedef struct
{
char *str; //注意此处声明的str指针
int len;
}HString;

//next
void GetNext(HString T,int* next)
{

int i=1;
int j=0;
next[0]=-1;
while (i<T.len)
{
if (j==-1||T.str[i]==T.str[j])
{
++i;
++j;
next[i]=j;
}
else j=next[j];
}



}
//nextval
void GetNextVal(HString T,int *nextval)
{
int i=1;
nextval[0]=-1;
int j=0;
while (i<T.len)
{
while (j==-1||T.str[i]==T.str[j])
{
++i;
++j;
if (T.str[i]!=T.str[j])
nextval[i]=j;
else nextval[i]=nextval[j];
}
j=nextval[j];
}
}
//KMP
int IndexKMP(HString S,HString T,int* next)
{
int i=0,j=0;
while (i<S.len&&j<T.len)
{
if (j==-1||S.str[i]==T.str[j])
{
++i;
++j;
}
else
j=next[j];
}
if (j >= T.len)
return i-T.len+1;
else
return 0;
}


void scan()
{
cout<<"1.next 匹配 2. nextval匹配"<<endl;
cout<<"其他退出"<<endl;
cout<<endl;
}

int main()
{

HString S,T;
S.str="swedfasfsdafsaasdfe"; //这里定义的一个字符串 在上面的函数中不能用啊
S.len=strlen(S.str);
T.str="fasf";//
T.len=strlen(T.str);
int next[100] = {0};
int nextval[100] = {0};

int sel;
int quit=0;
while (!quit)
{
scan();
cin>>sel;

int temp; //接收子串的起始位置
switch (sel)
{
case 1:
GetNext(T,next);
temp=IndexKMP(S,T,next);

/////写一个可以求出next长的函数
for (int m=0;m<100;m++)
cout<<next[m]<<' ';
cout<<endl;
if (temp)
cout<<"next 求出起始位置为:"<<temp<<endl;
else
cout<<"末找到符合的匹配的子串"<<endl;
break;

case 2:
GetNextVal(T,nextval);
temp=IndexKMP(S,T,nextval);
cout<<endl;
if (temp)
cout<<" nextval求出起始位置为:"<<temp<<endl;
else
cout<<"末找到符合的匹配的子串"<<endl;
break;
default:
quit=1;
break;
}
}


return 0;
}

超gogo 2009-05-16
  • 打赏
  • 举报
回复
谢谢以上的回答,我找到了解决方法 谢谢!
lire1213 2009-05-15
  • 打赏
  • 举报
回复
HString 有自定义考贝构造函数吗?
超gogo 2009-05-15
  • 打赏
  • 举报
回复
请各位继续 现在的问题是如果将S.str=“acabaabaabcacaabc”
应该输出 6
但是 输出的temp 的值不对。
超gogo 2009-05-15
  • 打赏
  • 举报
回复
不好意思
T.str[6]="abaabc";//这个地方T.str[6]相当于一个字符,而你赋值的是个字符串。并且你的T.str还没申请空间

这个错误是误写 这个程序我改了很多次 有些地方没改好
超gogo 2009-05-15
  • 打赏
  • 举报
回复
上面的大哥会所的很对 ,问题是解决了一些 不过 上面是KMP算法 ,next nextval 的值是对的,但是输出的temp的值不对

请各位知道KMP算法 的 帮忙 谢谢
cyldf 2009-05-15
  • 打赏
  • 举报
回复

int main()
{

HString S,T;
S.str="sdfasfsdafsaasdfe"; //这里定义的一个字符串 在上面的函数中不能用啊
S.len=17;
T.str[6]="abaabc";//这个地方T.str[6]相当于一个字符,而你赋值的是个字符串。并且你的T.str还没申请空间
T.len=6;
int next[100];
int nextval[100];

int sel;
int quit=0;
while(!quit)
{

goodname 2009-05-15
  • 打赏
  • 举报
回复
int next[100]={0};
int nextval[100]={0};

不知道上述两处是否需要初始化一下,根据你里面
GetNext,GetNextVal的算法
goodname 2009-05-15
  • 打赏
  • 举报
回复
T.str="abaabc";//这里不能用T.str[6]
超gogo 2009-05-15
  • 打赏
  • 举报
回复
各位 不好意思

上面的程序确实能够运行,但是为什么我在下面的程序中不能用呢????

#include<iostream>
using std::cin;
using std::cout;
using std::endl;

typedef struct
{
char *str; //注意此处声明的str指针
int len;
}HString;

//next
void GetNext(HString T,int* next)
{

int i=1;int j=0;
next[0]=1;
while(i<T.len)
{
if(j==0||T.str[i-1]==T.str[j-1])
{
++i;++j;
next[i]=j;
}
else j=next[j];
}



}
//nextval
void GetNextVal(HString T,int *nextval)
{
int i=1;nextval[1]=0;int j=0;
while(i<T.len)
{
if(j==0||T.str[i-1]==T.str[j-1])
{
++i;++j;
if(T.str[i-1]!=T.str[j-1])
nextval[i]=j;
else nextval[i]=nextval[j];
}
else j=nextval[j];
}
}
//KMP
int IndexKMP(HString S,HString T,int* next)
{
int i=0,j=1;
while(i<S.len&&j<S.len)
{
if(j==0||S.str[i]==T.str[j-1])
{
++i;
++j;
}
else j=next[j];
}
if(j>T.len)
return i-T.len+1;
else
return 0;
}


void scan()
{
cout<<"1.next 匹配 2. nextval匹配"<<endl;
cout<<"其他退出"<<endl;
cout<<endl;
}

int main()
{

HString S,T;
S.str="sdfasfsdafsaasdfe"; //这里定义的一个字符串 在上面的函数中不能用啊
S.len=17;
T.str[6]="abaabc";//
T.len=6;
int next[100];
int nextval[100];

int sel;
int quit=0;
while(!quit)
{
scan();
cin>>sel;

int temp; //接收子串的起始位置
switch(sel)
{case 1:
GetNext(T,next);
temp=IndexKMP(S,T,next);

/////写一个可以求出next长的函数
for(int m=0;m<100;m++)
cout<<next[m]<<' ';
cout<<endl;
if(temp)
cout<<"next 求出起始位置为:"<<temp<<endl;
else
cout<<"末找到符合的匹配的子串"<<endl;
break;

case 2:
GetNextVal(T,nextval);
temp=IndexKMP(S,T,nextval);
cout<<endl;
if(temp)
cout<<" nextval求出起始位置为:"<<temp<<endl;
else
cout<<"末找到符合的匹配的子串"<<endl;
break;
default:
quit=1;
break;
}
}


return 0;
}


lingyin55 2009-05-15
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;

int main()
{
char* m="afdsfdsfdsfds";
for(i=0;i <=strlen(m);i++)////这样好点
cout <<m[i];////可以直接这样取,正确的,另外也可以*(m+i)
return 0;
}
lingyin55 2009-05-15
  • 打赏
  • 举报
回复
这个问题简单,你的程序中有中文字符或者中文输入的空格,把每句前面的空格删除了,然后用
英文输入加空格就行。

[Quote=引用 7 楼 wangtengchao 的回复:]
错误的地址
CXX0030: 错误: 无法计算表达式的值

调试char* m="safsd" 会出现上面的错误
[/Quote]
超gogo 2009-05-15
  • 打赏
  • 举报
回复
再次说一下 不是i< 的问题 上面是我随便写的一个程序 谢谢
我的意思是需要一个实现我说的功能的程序 谢谢
lingyin55 2009-05-15
  • 打赏
  • 举报
回复
char* m="afdsfdsfdsfds";
for(i=0;i<=strlen(m);i++)////这样好点
cout<<m[i];////可以直接这样取,正确的,另外也可以*(m+i)

超gogo 2009-05-15
  • 打赏
  • 举报
回复
错误的地址
CXX0030: 错误: 无法计算表达式的值

调试char* m="safsd" 会出现上面的错误

cyldf 2009-05-15
  • 打赏
  • 举报
回复

#include <iostream>
using namespace std;

void main()
{
char *m="afasfasdkfj";
for(int i=0; i<strlen(m); i++)
{
cout<<m[i]<<endl;
}
}
goodname 2009-05-15
  • 打赏
  • 举报
回复
char* m="afdsfdsfdsfds";

int len = strlen(m);

for(int i=0;i <len;i++) cout <<m[i] << " ";
papaofdoudou 2009-05-15
  • 打赏
  • 举报
回复
没错啊,楼主用VC6看一下:
#include <iostream>
#include <cstring>
using namespace std;

void main(void)
{

char* m="afdsfdsfdsfds";
for(int i=0;i<strlen(m);i++)
cout<<m[i];
cout<<endl;
}
超gogo 2009-05-15
  • 打赏
  • 举报
回复
不是格式的错误 谢谢楼上的发言,上面是随便写的一个程序,我主要的意思是用char指针 或者string 定义,但是要像字符数组一样 可以一个个的编辑 ,谢谢
goodname 2009-05-15
  • 打赏
  • 举报
回复
char* m="afdsfdsfdsfds" ;//这里需要一个分号

for(i=0;i<20;i++) cout<<m[i];//字符串也不够20个字符

加载更多回复(1)
内容概要:本文围绕不确定环境下的多式联运路径优化问题展开研究,提出并实现了基于AFO算法、遗传算法(GA)和粒子群优化算法(PSO)的三种智能优化方法,并借助Matlab平台完成算法编程与仿真。研究构建了考虑时间、成本、转运风险等多重不确定因素的路径优化模型,系统比较了AFO、GA、PSO三种算法在收敛速度、全局寻优能力和稳定性方面的表现,同时引入Matlab自带的全局优化搜索器作为基准对照,深入分析各算法在复杂物流网络中的适用边界与性能差异。研究表明,AFO算法在解决此类组合优化问题时展现出更快的收敛效率和更强的局部规避能力。; 适合人群:具备一定Matlab编程基础与运筹优化知识,从事物流工程、交通运输规划、智能算法开发等相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于多式联运、综合货运网络中的路径决策支持系统构建;②为不确定性条件下复杂路径规划问题提供智能算法选型依据与技术实现方案;③支持科研人员复现主流优化算法并开展横向性能对比实验,推动算法改进与实际落地。; 阅读建议:建议读者结合提供的Matlab代码逐模块分析算法实现流程,重点理解目标函数设计、约束条件处理及参数敏感性分析部分,可通过调整问题规模与算法参数进行对比实验,进一步拓展至动态路径规划或大规模网络优化等延伸场景。
内容概要:本文研究了基于QLearning自适应强化学习的PID控制器在自主水下航行器(AUV)运动控制中的应用,通过Matlab代码实现了控制算法的仿真验证。该方法融合强化学习的在线自适应能力与传统PID控制的稳定性优势,利用QLearning算法动态优化PID控制器的比例、积分、微分参数,以应对水下复杂流体环境、模型不确定性及外部干扰等挑战,从而提升AUV轨迹跟踪的精度、鲁棒性与动态响应性能。文中系统阐述了AUV的六自由度非线性动力学建模过程、QLearning算法的状态空间与动作空间设计、奖励函数构造及训练机制,并详细说明了PID参数自整定的闭环控制架构。仿真结果表明,相较于传统固定参数PID控制器,该智能控制策略在多种工况下均展现出更优的控制效果,有效抑制了超调,加快了响应速度,并增强了抗干扰能力。; 适合人群:具备自动控制理论、强化学习基础及Matlab/Simulink仿真能力,从事水下机器人、智能控制、海洋工程、自动化等领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于AUV、UUV等无人水下平台的高精度自主导航与运动控制;②为解决非线性、强耦合、时变系统的控制器参数自适应整定问题提供智能化解决方案;③作为强化学习与经典控制理论深度融合的技术范例,推动智能控制算法在海洋装备中的工程化应用。; 阅读建议:建议读者结合提供的Matlab代码深入理解算法实现细节,重点剖析QLearning的状态-动作-奖励机制设计、PID参数更新逻辑及仿真对比实验结果,有条件者可在更复杂的动力学模型或实际硬件平台上进一步验证与优化算法性能。

65,211

社区成员

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

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