Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C+;中的char指针和fonction返回的char指针的奇怪行为+;加上;";_C++_Pointers_Char_Cout - Fatal编程技术网

C++ C/C+;中的char指针和fonction返回的char指针的奇怪行为+;加上;";

C++ C/C+;中的char指针和fonction返回的char指针的奇怪行为+;加上;";,c++,pointers,char,cout,C++,Pointers,Char,Cout,我有一个奇怪的行为,一个由返回函数值初始化的char指针和cout 我所有的代码都是针对Arduino应用程序的,这就是为什么我使用char指针、char数组和string.h。 我创建了一个名为FrameManager的类,该类使用函数getDataFromFrame从字符串(实际上是一个字符数组)中提取数据。见上文: `char * FrameManager::getDataFromFrame ( const char frame[], char key[] ) { char *pVal

我有一个奇怪的行为,一个由返回函数值初始化的char指针和cout

我所有的代码都是针对Arduino应用程序的,这就是为什么我使用char指针、char数组和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, 0, 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, 0, index+1 );
            memcpy ( buffKey, &subbuff[0], index );
            buffKey[index+1]='\0';
            char buffValue[buffLength-index];
            memset ( buffValue, 0, 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, &frame[previousStartIndex], frameLength-1 );
        subbuff[buffSize]='\0';
        int buffLength = strlen ( subbuff );
        const char *ptr = strchr ( subbuff, ':' );
        if ( ptr ) {
            int index = ptr-subbuff;
            char buffKey[index+1];
            memset ( buffKey, 0, index+1 );
            memcpy ( buffKey, &subbuff[0], index );
            buffKey[index+1]='\0';
            char buffValue[buffLength-index];
            memset ( buffValue, 0, buffLength-index );
            memcpy ( buffValue, &subbuff[index+1], buffLength-index );
            buffValue[buffLength-index]='\0';

            if ( strcmp ( key,buffKey ) == 0 ) {
                pValue = &buffValue[0];
                break;
            }
        }
    }
}

return pValue;
`char*FrameManager::getDataFromFrame(const char frame[],char key[])
{
char*pValue=nullptr;
int frameLength=strlen(帧);
int-previousStartIndex=0;

for(int i=0;i
pValue
指向超出范围的本地数组。这是未定义的行为。它可能会工作,但您的程序也可能会崩溃、返回错误的值(这是您遇到的)、损坏数据或执行任何其他任意操作


考虑到您已经使用C++,考虑使用<代码> STD::String < /Cord>作为替代,或者指向原始<代码>框架< /> >(如果可能).< /P>忽略C++的东西,在C中,我将结果缓冲区传递给函数:<代码> char *GETDATAOFFrm(char *DST,const char *帧,const char key)

您好,谢谢您的快速回复。我做了修改,现在我将结果缓冲区传递给函数,它正在工作:)
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;
}