2011-03-31 70 views
0

我想通过指针传递一些可变参数,但我还没有完全明白。 解析器不工作,但这不是我的问题。 我使用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; 
} 
+1

什么是你的代码做什么,以及如何从你所希望看到的有什么不同? – 2011-03-31 13:49:22

+0

而且:那些'calloc'和'substr'调用是什么? C标准库中有一个'calloc',但它只有两个参数。 – 2011-03-31 13:52:26

+0

我重新格式化了你的代码。我希望你不介意。 – 2011-03-31 14:00:17

回答

0

相反的*va_arg(ap,char*)=parsed_text

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

+0

这工作,非常感谢。 – 2011-03-31 14:30:01

0

va_arg(ap,char*)返回char*类型的值。也就是说,这是一个指向char的指针。但是你正试图在它指向的地方存储一个char*值。我想你实际上想复制你从那里的命令中提取的字符,其中strcpymemcpy或其他类似的东西。顺便说一句,如果你这样做,那么你的解析器 - 就像scanf函数,如果使用不谨慎 - 将会容易受到缓冲区溢出的影响,如果它被要求解析包含变量的参数太长,存储在。但这是一个单独的问题,它可能会或可能不会是一个严重的问题,这取决于您的其他代码。

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

其他问题:

我没有看到被分配用于parsed_text任何记忆,但很难说没有看到的substr定义。它是一个函数还是一个宏?究竟应该做什么?实际上,如果substr正在分配内存,则会遇到不同的问题,因为没有任何操作可以再次释放它。

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

+0

非常感谢您的完整评论。我现在没有处理任何错误。我认为正在编写命令的人可以正确执行......(:|)感谢您的帮助! – 2011-03-31 14:30:56