2016-10-28 6 views
2

Как использовать восьмеричную строку из * ARGV [] что-то вроде:восьмеричного строку в целом число открытыхов (O_CREATE) разрешения

open("outfile",O_CREAT | O_RDWR,0777); 

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

Terminal:

./copymaster -c 0777 in 
argv optind 0777 after atoi 777 
fd 5 

Но разрешения не установлены в 0777. open() просто игнорирует arC.

Как преобразовать эту строку argv[optind] в полезную форму для команды open()?

+2

Не уверен, что вы просите, но, возможно, вам нужно ['strtol'] (http://www.cplusplus.com/reference/cstdlib/strtol/). –

+0

Просто для получения функций 'ato *()'. Они ненадежны, чтобы не сказать бесполезно, поскольку они неправильно указывают на неудачи конверсии. Перейдите к семейству функций 'strto *()'. – alk

ответ

2

atoi преобразует строку в целое число, когда строка содержит целое число в десятичном представлении.

Но в вашем случае номер указан в восьмеричном представлении, поэтому вы не можете использовать atoi.

Функция strtol более общая, потому что вы можете указать базу (8 в вашем случае).

Заменить

int arC = atoi(argv[optind]); // convert decimal number 

по

int arC = strtol(argv[optind], NULL, 8); // convert octal number 

С этой модификации ваша программа будет печатать это:

./copymaster -c 0777 in 
argv optind 0777 after strtol 511 
... 

511 быть 0777 octal преобразуется в десятичную.

+0

Если вы не используете конечный указатель ('dummy' здесь), то только передача' NULL' будет в порядке. – alk

+0

@alk хорошая точка, спасибо –

+0

Обратите внимание, что ведущий '0' не нужен в' 0777', но и не наносит вреда. IMO, команда '0' должна быть указана в команде и использовать' strtol (argv [optind], NULL, 0); 'для ввода шестнадцатеричного/десятичного ввода. – chux