2013-04-18 71 views
0

我正努力將一個可執行程序轉換爲一個函數,我可以從我的主程序中調用該函數。由於它目前是寫,可執行如下:命令行參數的數據類型

int main(int argc, char* argv[]){ 
    //do stuff 
    if(setxattr(argv[4], tmpstr, argv[3], strlen(argv[3]), 0)){ 
     perror("setxattr error"); 
     exit(EXIT_FAILURE); 
    } 
    //do more stuff 
} 

我可以調用這個如下,它的工作原理成功:

./set_attributes -s encrypted 1 ~/text.txt

但現在我想這個遷入嵌入另一個函數程序。失敗的部分是strlen(argv[3])。我的新功能如下:

int set_encr_attr(char* fpath, int value) { 

    char* userstr = NULL; 

    /* Check that the value to set is either 0 or 1 */ 
    if (!((value == 0) || (value == 1))) { 
     return -1; 
    } 

    //do stuff (including malloc(userstr) 
    strcpy(userstr, XATTR_USER_PREFIX); 

    /* Set attribute */ 
    if(setxattr(fpath, userstr, value, 1, 0)){ 
     perror("setxattr error"); 
     exit(EXIT_FAILURE); 
    } 

    return EXIT_SUCCESS; 
} 

正如你所看到的,我已經取代了與1號第四個參數,因爲我已經檢查了價值傳遞的是0或1,從而它必須具有爲1的strlen的我已經嘗試了一些其他的東西,但我總是得到這個錯誤:

xattr_new.c: In function ‘set_encr_attr’:

xattr_new.c:52:2: warning: passing argument 3 of ‘setxattr’ makes pointer from integer without a cast [enabled by default]

/usr/include/i386-linux-gnu/sys/xattr.h:40:12: note: expected ‘const void *’ but argument is of type ‘int’

當我玩這個,我可以看到的strlen(的argv [3])== 1,所以我不明白爲什麼我不能只用整數1替換它。至於打字問題,我試過鑄造(我認爲這通常是一個壞主意),但我無法做到工作。

任何人都可以幫忙嗎?謝謝!

回答

0

1是一個整數,"1"是一個字符串,長度爲2的字符數組,其中包含ASCII字符'1'(值49)後跟空字節(終止符)。該函數不需要一個整數,它需要一個字符指針。 strlen("1") = 1,因爲字符串由空字節分隔。

+0

謝謝。我明白所有這些,但我仍然看不到解決方案。在我用這個參數代替的許多事情中,有「1」,strlen(「1」),以及聲明一個char *並賦值爲1(和一個空終止符)。 – Alex 2013-04-18 04:21:37

+0

在您發佈的新代碼中,setxattr的第三個參數是int。它需要是一個字符指針,就像你的原始代碼一樣。你正試圖傳遞一個INTEGER,而不是一個字符串! – DoxyLover 2013-04-18 16:21:54

0

你有沒有嘗試過使用atoi()將你的參數轉換爲整數,然後將它們傳遞給你的函數?不清楚爲什麼你想要傳遞一個數字作爲字符串,如果你不需要的話。