簡體   English   中英

在C中使用strcat獲取權限

[英]Using strcat for permissions in 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;
}

問題是這兩行:

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

第一個使mode_s指向您分配的內存。 下一行使其指向"d""-" 您重新指定指針並使其指向其他位置。

由於您將內存初始化為零,因此也可以在此處使用strcat strcpy

當您添加目錄標志時,您將mode_s重新分配給字符串常量,丟棄已分配的內存。

在這種情況下,您需要使用strcpy來復制字符。

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

在第一次測試中將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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM