2013-04-18 98 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()将你的参数转换为整数,然后将它们传递给你的函数?不清楚为什么你想要传递一个数字作为字符串,如果你不需要的话。