【问题标题】:Data type of command line args命令行参数的数据类型
【发布时间】:2013-04-18 03:34:53
【问题描述】:

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

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 使指针从整数不带 cast [默认启用]

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

当我玩这个时,我可以看到 strlen(argv[3]) == 1,所以我不明白为什么我不能用整数 1 替换它。至于打字问题,我已经尝试过强制转换(我认为这通常是个坏主意),但我无法成功。

有人可以帮忙吗?谢谢!

【问题讨论】:

    标签: c attributes typing


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我明白这一切,但我仍然没有看到解决方案。在我替换该参数的许多内容中,有“1”、strlen(“1”),以及声明一个 char* 并将其赋值为 1(和一个空终止符)。
    • 在您发布的新代码中,setxattr 的第三个参数是一个 int。它需要是一个 char 指针,就像在您的原始代码中一样。您正在尝试传递一个 INTEGER,而不是一个字符串!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-12
      • 2017-11-23
      • 2012-10-04
      • 2016-03-25
      • 1970-01-01
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      相关资源
      最近更新 更多