在C中使用strcat获取权限

时间:2016-10-28 14:35:08

标签: c

请帮助,疯了,现在已经尝试了8个小时,它永远不会有效。我意识到我可以轻松打印出文件的权限,我已设法做到这一点,但我无法使用此方法返回它。

char *printMode(mode_t mode) {
    char *myString = (char *)calloc(11, sizeof(char));

    mode_s = ((S_ISDIR(mode)) ? "d" : "-");
    strcat(mode_s, ((mode & S_IRUSR) ? "r" : "-"));
    strcat(mode_s, ((mode & S_IWUSR) ? "w" : "-"));
    strcat(mode_s, ((mode & S_IXUSR) ? "x" : "-"));
    strcat(mode_s, ((mode & S_IRGRP) ? "r" : "-"));
    strcat(mode_s, ((mode & S_IWGRP) ? "w" : "-"));
    strcat(mode_s, ((mode & S_IXGRP) ? "x" : "-"));
    strcat(mode_s, ((mode & S_IROTH) ? "r" : "-"));
    strcat(mode_s, ((mode & S_IWOTH) ? "w" : "-"));
    strcat(mode_s, ((mode & S_IXOTH) ? "x" : "-"));

    return myString;
}

3 个答案:

答案 0 :(得分:6)

问题在于这两行:

char *mode_s = (char *) calloc(MODE_S_LEN, sizeof(char));
mode_s = ((S_ISDIR(mode)) ? "d" : "-");

第一个使mode_s指向您分配的内存。下一行指向"d""-"。你重新指定指针并指向其他地方。

由于您将分配的内存初始化为零,因此您也可以在此使用strcat。或strcpy

答案 1 :(得分:3)

当您添加目录标志时,您将mode_s重新分配给字符串常量,丢弃已分配的内存。

在这种情况下,您需要使用strcpy复制字符。

strcpy(mode_s, ((mode & S_ISDIR) ? "d" : "-"));

答案 2 :(得分:0)

您在第一次测试中将mode_s初始化为"d""-"。随后对strcat()的调用调用未定义的行为作为字符串文字不应该被修改,并且对strcat()来说太短了。

您可以通过提高警告级别来避免此类错误:gcc -Wall -W会告诉您将常量字符串指针存储到常规char *中。

你的方法效率很低,这是一个更简单,更快捷的选择:

char *printMode(mode_t mode) {
    char buf[11];
    int i = 0;

    buf[i++] = S_ISDIR(mode) ? 'd' : '-';
    buf[i++] = (mode & S_IRUSR) ? 'r' : '-';
    buf[i++] = (mode & S_IWUSR) ? 'w' : '-';
    buf[i++] = (mode & S_IXUSR) ? 'x' : '-';
    buf[i++] = (mode & S_IRGRP) ? 'r' : '-';
    buf[i++] = (mode & S_IWGRP) ? 'w' : '-';
    buf[i++] = (mode & S_IXGRP) ? 'x' : '-';
    buf[i++] = (mode & S_IROTH) ? 'r' : '-';
    buf[i++] = (mode & S_IWOTH) ? 'w' : '-';
    buf[i++] = (mode & S_IXOTH) ? 'x' : '-';
    buf[i++] = '\0';

    return strdup(buf);
}