【问题标题】:My program won't print my results [duplicate]我的程序不会打印我的结果[重复]
【发布时间】:2017-08-22 17:03:54
【问题描述】:

我最近编写了一个蛮力程序,将八进制数据从 Unix 中的权限转换为人类可读的形式(例如 755 -> rwxr-xr-x)但是,每当我运行名为 myperm 的程序时,我都没有得到结果(例如 @ 987654323@) 我不太清楚为什么有人可以帮助解决这个问题

#include <stdio.h>
#include <string.h>
int main (int argc, char *argv[])
{
       if (argv[1] == "777")
       {
          printf("rwxrwxrwx");
       }

       else if (argv[1] == "755")
       {
            printf("rwxr-xr-x");
       }

       else if (argv[1] == "750")
       {
            printf("rwxr-x---");
       }
       else if (argv[1] == "700")
       {
            printf("rwxr-x---");
       }
       else if (argv[1] == "666")
       {
            printf("rw-rw-rw");
       }
       else if (argv[1] == "664")
       {
            printf("rw-rw-r--");
       }
       else if (argv[1] == "640")
       {
            printf("rw-r-----");
       }
       else if (argv[1] == "600")
       {
            printf("rw-------");
       }
       else if (argv[1] == "400")
       {
            printf("r--------");
       }
return (0);

}

【问题讨论】:

  • (argv[1] == "777") -> (strcmp(argv[1],"777") == 0)
  • "..." 计算为字符数组,您需要比较字符,而不是地址。
  • 旁注:您的代码非常糟糕:考虑编写一个将八进制数字转换为“rwx”(7)的函数,否则您的代码将非常长并且容易出错,涵盖所有情况。

标签: c unix printing printf octal


【解决方案1】:

在 C 中比较字符串不能这样工作,你必须使用 strcmp

你应该做if (strcmp(argv[1], "XXX") == 0)而不是if (argv[1] == "XXX")

Read on here

【讨论】:

  • 由于您已经找到了正确的规范副本,只需将投票标记/关闭为重复,而不是发布答案。
【解决方案2】:
argv[1] == "755"

不是你在C中如何比较字符串,你需要使用:

strcmp (argv[1], "755") == 0

在任何情况下,这种“蛮力”方法都是完全不必要和不可靠的(缺少可能性,仅处理 512 种可能性中的九种,即使 没有考虑 setuid 和 setgid 位等开)。

最好有一个函数来评估一个八进制数字,例如:

static const char * permXlat (char octal) {
    switch (octal) {
        case '0' : return "---";
        case '1' : return "--x";
        case '2' : return "-w-";
        case '3' : return "-wx";
        case '4' : return "r--";
        case '5' : return "r-x";
        case '6' : return "rw-";
    }
    return "rwx";
}

然后一次处理一个字符:

printf ("%s%s%s\n",
    permXlat (argv[1][0]),
    permXlat (argv[1][1]),
    permXlat (argv[1][2]));

添加您认为必要的任何健全性检查(参数列表大小、字符值等)。

【讨论】:

  • 自鸣得意的版本是ch -= '0'; for(uint8_t i = 0; i&lt;3; i++) { result[i] = ch&amp;1&lt;&lt;2-i?i["rwx"]:'-'; } result[3] = '\0';。这个版本……没有任何优势。但它看起来很酷。
猜你喜欢
  • 2013-09-26
  • 2013-06-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2014-04-01
  • 1970-01-01
  • 2017-03-04
相关资源
最近更新 更多