我的程序不会打印我的结果

时间:2017-03-29 09:30:54

标签: c unix printing printf octal

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

#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);

}

2 个答案:

答案 0 :(得分:3)

比较C中的字符串不起作用,您必须使用strcmp

您应该执行if (argv[1] == "XXX")

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

Read on here

答案 1 :(得分:1)

argv[1] == "755"

如何比较C中的字符串,您需要使用:

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

在任何情况下,这种“强力”方法都是完全不必要和不可靠的(缺少可能性,512种可能性中只有9种被处理,甚至没有考虑到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]));

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