如何解决使用“cout”
我有一个奇怪的行为,char 指针由返回函数的值和 cout 初始化。
我所有的代码都是针对 Arduino 应用程序的,这就是我使用字符指针、字符数组和 string.h 的原因。 我创建了一个名为 FrameManager 的类,使用函数 getDataFromFrame 从字符串(实际上是一个字符数组)中提取数据。见上:
`char * FrameManager::getDataFromFrame ( const char frame[],char key[] )
{
char *pValue = nullptr;
int frameLength = strlen ( frame );
int prevIoUsstartIndex = 0;
for ( int i=0; i<frameLength; i++ ) {
char c = frame[i];
if ( c == ',' ) {
int buffSize = i-prevIoUsstartIndex+1;
char subbuff[buffSize];
memset ( subbuff,buffSize ); //clear buffer
memcpy ( subbuff,&frame[prevIoUsstartIndex],i-prevIoUsstartIndex );
subbuff[buffSize]='\0';
prevIoUsstartIndex = i+1;
int buffLength = strlen ( subbuff );
const char *ptr = strchr ( subbuff,':' );
if ( ptr ) {
int index = ptr-subbuff;
char buffKey[index+1];
memset ( buffKey,index+1 );
memcpy ( buffKey,&subbuff[0],index );
buffKey[index+1]='\0';
char buffValue[buffLength-index];
memset ( buffValue,buffLength-index );
memcpy ( buffValue,&subbuff[index+1],buffLength-index );
buffValue[buffLength-index]='\0';
if ( strcmp ( key,buffKey ) == 0 ) {
pValue = &buffValue[0];
break;
}
}
} else if ( i+1 == frameLength ) {
int buffSize = i-prevIoUsstartIndex+1;
char subbuff[buffSize];
memcpy ( subbuff,frameLength-1 );
subbuff[buffSize]='\0';
int buffLength = strlen ( subbuff );
const char *ptr = strchr ( subbuff,buffKey ) == 0 ) {
pValue = &buffValue[0];
break;
}
}
}
}
return pValue;
}`
在 main() 中,我创建了一些代码来测试返回值:
int main(int argc,char **argv) {
const char frame[] = "DEVICE:ARM,FUNC:MOVE_F,ParaM:12,SERVO_S:1";
FrameManager frameManager;
char key[] = "DEVICE";
char *value;
value = frameManager.getDataFromFrame(frame,&key[0]);
cout << "Retrieved value: " << value << endl;
cout << "Retrieved value: " << frameManager.getDataFromFrame(frame,&key[0]) << endl;
printf("%s",value);
return 0;
}
这里是结果:
- 检索值:y%r
- 检索值:ARM
- ARM
第一个“cout”不显示预期值。 第二个“cout”也显示预期值和 printf。
我不明白第一个“cout”有什么问题。
谢谢
乔斯林
解决方法
pValue
指向超出范围的本地数组。这是未定义的行为。它可能会工作,但您的程序也可能会崩溃、返回错误值(这就是您遇到的情况)、损坏您的数据或执行任何其他任意操作。
鉴于您已经在使用 C++,请考虑使用 std::string
作为结果,或者指向原始的 frame
(如果可能)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。