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 加密 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,因此它的 strlen 必须为 1。我尝试了一些其他事情,但我总是得到这个错误:

xattr_new.c:在函数“set_encr_attr”中:

xattr_new.c:52:2:警告:传递 'setxattr' 的参数 3 使指针从整数而不进行强制转换 [默认启用]

/usr/include/i386-linux-gnu/sys/xattr.h:40:12:注意:预期为“const void *”,但参数的类型为“int”</p>

当我玩这个时,我可以看到 strlen(argv[3]) == 1,所以我不明白为什么我不能用整数 1 替换它。至于打字问题,我试过了铸造(我认为这通常是一个坏主意),但我无法让它发挥作用。

任何人都可以帮忙吗?谢谢!

4

2 回答 2

0

在将参数传递给函数之前,您是否尝试过使用 atoi() 将参数转换为整数?我不清楚为什么你想将数字作为字符串传递,如果你不需要的话。

于 2013-04-18T09:42:33.507 回答
0

1是一个整数,"1"是一个字符串,一个长度为 2 的字符数组,包含 ASCII 字符“1”(值 49),后跟一个空字节(终止符)。该函数不需要整数,它需要一个 char 指针。strlen("1")= 1,因为字符串由空字节分隔。

于 2013-04-18T03:45:21.923 回答