2011-03-31 76 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