open(O_CREATE) 权限的八进制字符串到整数

Vla*_*cák 4 c atoi octal string-conversion

如何将 *argv[] 中的八进制字符串用于以下内容:

open("outfile",O_CREAT | O_RDWR,0777);
Run Code Online (Sandbox Code Playgroud)

0777 表示八进制数的许可。

我的代码:

int arC = atoi(argv[optind]);
printf("argv optind %s after atoi %d\n",argv[optind],arC);
int test =des2=open("createfile",O_CREAT | O_RDWR,arC);
printf("fd %d\n",test);
Run Code Online (Sandbox Code Playgroud)

终端输出:

./copymaster -c 0777 in 
argv optind 0777 after atoi 777
fd 5
Run Code Online (Sandbox Code Playgroud)

但权限未设置为 0777。open()只是忽略arC.

如何将此字符串转换argv[optind]open()命令的可用形式?

Jab*_*cky 5

atoi 当字符串包含十进制表示的整数时,将字符串转换为整数。

但是在您的情况下,数字以八进制表示形式给出,因此您不能使用atoi.

strtol函数更通用,因为您可以指定基数(在您的情况下为 8)。

代替

int arC = atoi(argv[optind]);    // convert decimal number
Run Code Online (Sandbox Code Playgroud)

经过

int arC = strtol(argv[optind], NULL, 8);   // convert octal number
Run Code Online (Sandbox Code Playgroud)

通过此修改,您的程序将打印:

./copymaster -c 0777 in 
argv optind 0777 after strtol 511
...
Run Code Online (Sandbox Code Playgroud)

5110777 octal转换为十进制。