如何将以0开头的数字字符串转换为八进制数

4

我正在尝试做这件事:

void main(int argc, char *argv[]){
int mode,f;

mode = atoi(argv[2]);

if((f = open("fichero.txt",O_CREAT, mode))==-1){    
    perror("Error");
    exit(1);
}

}

然而,当我输入类似于0664这样的数字时,mode应该等于664。我该如何保留前导零?


4
使用 strtol(argv[2], NULL, 8);。该函数将把 argv[2] 解释为一个八进制数,并将其转换为长整型返回。 - Eugene Sh.
1个回答

7

atoi函数假定字符串是一个十进制数的表示。如果您想要转换不同进制的数,请使用strtol

mode = strtol(argv[2], NULL, 0);

第三个参数指定数字的进制,如果该值为0,则会根据开头是否是0x来判断字符串是否为十六进制,是否以0开头来判断是否为八进制,否则将视为十进制。

如果你期望字符串始终是八进制表示,则将基数设置为8.

mode = strtol(argv[2], NULL, 8);

4
第三个参数在这里尤其重要,因为数值模式的传统表示是八进制,无论是否有前导零。如果将数值模式字符串按十进制转换,可能会产生意想不到的结果。 - John Bollinger
mode=strtol(argv[2], NULL, 8)和mode=strtol(argv[2], NULL, 0)都会将数字转换为十进制,因此如果我输入0664,它们会将我的模式设置为436。我该如何解决这个问题? - Eduardo Ramos
@EduardoRamos 我刚测试了一下,它可以正常工作。你是如何检查这个值的? - dbush
是的,它确实有效。printf() 欺骗了我。非常感谢你! - Eduardo Ramos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接