我最近编写了一个强力程序,将八进制数据从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);
}
答案 0 :(得分:3)
比较C中的字符串不起作用,您必须使用strcmp
您应该执行if (argv[1] == "XXX")
if (strcmp(argv[1], "XXX") == 0)
答案 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]));
添加您认为必要的健全性检查(参数列表大小,字符值等)。