2012-01-16 3 views
3

Пожалуйста, помогите мне с моим кодом. Я использую функцию system() в c. Предположим, я хочу создать новый каталог, используя C-код.Как использовать переменную в системе() в c

char name[]; 

printf("Enter the name of directory: "); 
scanf("%s", &name); 

Затем с помощью system(), я хочу использовать переменную name[] вместо того, чтобы использовать или положить фиксированное значение, как system("mkdir ryan");, что делает новый каталог ryan; я хочу, чтобы создать любое имя каталога и сохранить его в переменной name[] и реализовать это значение вместо ryan. Ваши ответы высоко ценятся.

+1

'system' не правильный способ вызова' mkdir'. Существует отличная функция 'mkdir' для вызова. Использование 'system' приводит к любым видам безопасности, надежности и производительности, которые никогда не должны вводиться для начала. В принципе, забывайте, что вы когда-либо слышали о «системе». Это не должно использоваться ** абсолютно. –

+2

За исключением случаев, когда это необходимо :-) – paxdiablo

ответ

-3

Try:

char command[80]; 
strcpy(command, "mkdir "); 
strcat(command, name); 
system(command); 
+2

вы НЕ МОЖЕТЕ использовать strcat с константой char * в качестве первого параметра. –

+0

@AhmedMasud К сожалению, спасибо за внимание! Теперь лучше? – wrongusername

+1

Зачем так сложно использовать snprintf –

0

Во-первых (и это, вероятно, не имеет значения, если ваш код просто пример), никогда не использовать неограниченное %sscanf - что открывает вас к переполнению буфера.

Если у вас есть строка, как:

char name[] = "paxdiablo"; 

вы можете просто использовать, чтобы построить свою собственную строку для выполнения.

char cmd[1000]; 
strcpy (cmd, "mkdir "); 
strcat (cmd, name); 
system (cmd); 

И убедитесь, что вы знаете (или проверить с strlen или динамически выделять буфер, так что это достаточно большой) размер name так, что вы не до конца с переполнением буфера и там.

Пример динамического распределения одного:

void tryMkdir (char *dir) { 
    static char prefix[] = "mkdir "; 
    // Use sizeof to allow for null char at end. 
    char *cmd = malloc (sizeof (prefix) + strlen (dir)); 
    if (cmd != NULL) { 
     strcpy (cmd, prefix); 
     strcat (cmd, dir); 
     system (cmd); 
     free (cmd); 
    } 
} 

(хотя вы, вероятно, хотите проверить некоторые ошибки там в случае mkdir или malloc не удалось).

+0

Что не так с snprintf? –

+0

Ничего. Есть много способов сделать работу. Для простой конкатенации строк я предпочитаю 'strcat', а не полную мощность' snprintf' (здесь нет необходимости проверять длину, так как мы гарантируем, что буфер достаточно большой). Если бы я строит строку, состоящую из более чем двух вещей или не уверенную в длине, я бы, вероятно, переключился, но в этом случае я не считаю нужным. – paxdiablo

+0

Все это звучит сложнее с malloc, несколькими вызовами и т. Д. - где один snprintf будет работать с массивом в стеке размера MAX_PATH (не на 100% уверен в переносимости этого макроса). И действительно, OP должен использовать системный вызов для создайте каталог - потому что его ограничение как использование системного вызова, но без какой-либо странной стороны влияет на выполнение неподдерживаемой команды на OS –

0

Вам нужно будет создать строку с вашей полной командой для отправки в систему(), что означает выделение для нее пространства (которое вы не делали для имени в исходном коде, чтобы ваш вызов scanf скорее всего не удастся). Что-то вроде вашего примера mkdir, вы можете создать строку, начинающуюся с mkdir &, после этого достаточно места для имени вашего каталога, а когда вы вызываете scanf, укажите его в местоположение внутри этой строки, в которой вы хотите, чтобы имя было отправлено; что вам нужно сделать strcat или somesuch afterward, и если это единственное, что вам нужно для имени каталога, зачем хранить его дважды?

6

Вы должны использовать что-то вроде:

char name[100]; 
printf("Enter the name of the directory: "); 
if (scanf("%99s", name) == 1) // Not &name 
{ 
    char command[120]; 
    sprintf("%s %s", "mkdir", name); 
    if (system(command) != 0) 
     ...oops... 
} 
+1

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

+2

Поскольку я ограничил ввод менее чем 100 символами, а 'strlen (" mkdir ")' меньше 20, это безопасно, поскольку оно стоит. В других случаях лучше использовать 'snprintf()'. –

+0

Очень хорошее решение. –

1

вот пример того, как это может быть реализовано:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/wait.h> 

int main() { 
    char *dirname = NULL; 
    char *cmdline = NULL; 
    size_t len; 
    size_t dirlen = 0; 
    int rv = 0; 

    printf("Enter directory: "); 
    if ((len = getline(&dirname, &dirlen, stdin)) < 0) { 
     perror("getline"); 
     exit(-1); 
    } 

    dirname[len-1] = 0; 
    cmdline = malloc(len+8); 
    snprintf(cmdline, dirlen+8, "mkdir %s", dirname); 
    rv = system(cmdline); 
    free(cmdline); 
    free(dirname); 
    rv = WEXITSTATUS(rv); 
    return rv; 
} 
+1

Не забудьте также выпустить 'dirname'. Также стоит отметить, что ['getline()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/getdelim.html) находится в POSIX 2008 и, хотя он доступен в Linux и * BSD (включая MacOS X), он доступен не везде. –