2016-12-21 4 views
4

Я пытаюсь сделать это:Как преобразовать цифровую строку, начиная с 0 до восьмеричных

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, режим равен 664. Как я могу держать, что ведущее нуль?

+4

использование 'strtol (ARGV [2], NULL, 8);' –

ответ

7

Функция atoi предполагает, что строка является десятичным представлением числа. Если вы хотите конвертировать из разных баз, используйте strtol.

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

Третий аргумент указывает номер базы. Если это значение равно 0, оно будет обрабатывать строку как шестнадцатеричную, если она начинается с 0x, восьмеричная, если она начинается с 0, и десятичной в противном случае.

Если вы ожидаете, что строка всегда восьмеричное представление, затем установите основание на 8.

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

И третий аргумент особенно важно здесь, поскольку стандартное представление для числовых режимов является восьмеричным, независимо от того, есть ли начальный ноль или нет. Преобразование строки числового режима, как если бы оно выражалось в десятичной форме, скорее всего, приведет к непреднамеренному результату. –

+0

Оба режима = strtol (argv [2], NULL, 8) и mode = strtol (argv [2], NULL, 0) делают число десятичным, поэтому, если ввести 0664, он установит мой режим на 436. Как я могу почини это? –

+0

@EduardoRamos Я только что проверил это, и он работает правильно. Как вы проверяете ценность? – dbush