改变返回的可变参数函数指针

时间:2011-03-31 13:45:11

标签: c pointers function-pointers variadic-functions

我正在尝试通过指针传递一些可变参数,但我还没有完全理解它。 解析器无法正常工作,但这不是我的问题。 我正在使用C的子集,但不要担心语法或词汇。

它应该像:

一样使用
void functionX(void){
  action[100]="GO_PLAY(12345,23)";
  char id[10];
  char offset[10];
  ParseCommand("GO_PLAY",action,2,&id,&offset);
  // after this id should be "12345" and offset should be "23"
}

bool ParseCommand(char *command, char * buffer,int count, ...){
  bool returnvalue=FALSE;
  int command_len=O_strlen(command);
  int buffer_len=O_strlen(buffer);
  int j=command_len+1;
  va_list ap;
  int parameter=0;
  char *parsed_text;
  va_start(ap, count);         /* Initialize the argument list. */
  while(parameter<count) {
    while(buffer[j]!=','&& buffer[j]!=')') //search argument
      j++;
    if(j<buffer_len) { // argument found
      calloc(MODULE,parsed_text,j-(command_len+1),sizeof(char));
      substr(command_len+1,j,buffer,parsed_text,buffer_len);
      *va_arg(ap,char*)=parsed_text; // why isnt this working?
      parameter++;
      j++; // to continue to search
    }
  }
  leave:
  va_end (ap);
  return returnvalue;
}

2 个答案:

答案 0 :(得分:0)

va_arg(ap,char*)返回char*类型的值。也就是说,它是指向char的指针。但是您尝试在其指向的位置存储char*值。我认为您实际上想要使用strcpymemcpy或类似的东西复制您从命令中提取的字符。

顺便说一句,如果你这样做那么你的解析器 - 就像scanf函数一样,如果不谨慎地使用 - 如果要求解析包含对于变量来说太长的参数的东西,它将容易受到缓冲区溢出的影响'存储在。但这是一个单独的问题,它可能是也可能不是一个严重的问题,取决于你的其余代码。

(或许你打算复制parsed_text的(指针)值,而不是复制字符。但是你有另一个问题:idoffset不是指针变量,所以即使你想要也不能这样做。)

其他问题:

我没有看到为parsed_text分配任何内存,但如果没有看到substr的定义,很难说清楚。它是函数还是宏?到底应该做什么?实际上,如果substr正在分配内存,那么你会遇到另外一个问题,因为没有任何东西可以再次释放它。

如果你的输入命令语法错误,你的while循环可以在字符串的末尾运行,循环直到它试图访问一些不允许的内存。例如,如果您拨打ParseCommand("GO_PLAY","GO_PLAY(broken",2,&id,&offset)

,就会发生这种情况

答案 1 :(得分:0)

而不是*va_arg(ap,char*)=parsed_text

尝试:sprintf(va_arg(ap, char*), "%s", parsed_text);