命令行参数的数据类型

时间:2013-04-18 03:34:53

标签: c attributes typing

我正在努力将可执行程序转换为我可以在主程序中调用的函数。正如目前所写,可执行文件如下所示:

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:在函数'set_encr_attr'中:

     

xattr_new.c:52:2:警告:   传递'setxattr'的参数3使得指针来自整数而没有   cast [默认启用]

     

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

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

有人可以帮忙吗?谢谢!

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你是否曾尝试使用atoi()将参数转换为整数,然后再将它们传递给函数?我不清楚为什么你想要将一个数字作为字符串传递,如果你没有。