2012-01-16 28 views
3

請幫我看看我的代碼。我正在使用c中的system()函數。假設我想用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'會導致各種安全性,健壯性和性能問題,這些問題本來就不應該引入。基本上,忘記你曾聽說過'系統'。它絕對不能**被使用。 – 2012-01-16 04:27:12

+2

除非你需要它:-) – paxdiablo 2012-01-17 09:25:36

回答

-3

嘗試:

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

你不能使用帶const char *的strcat作爲第一個參數。 – 2012-01-16 02:24:28

+0

@AhmedMasud哎呀,感謝您的提醒!現在好點了嗎? – wrongusername 2012-01-16 02:26:08

+1

爲什麼使它如此複雜snigraf – 2012-01-16 02:33:50

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

(雖然你可能想在有一些錯誤檢查,以防mkdirmalloc失敗)。

+0

snprintf有什麼問題? – 2012-01-16 02:34:13

+0

什麼都沒有。有很多方法可以完成這項工作。對於簡單的字符串連接,我更喜歡'strcat'而不是'snprintf'的全部功能(因爲我們確保緩衝區足夠大,所以在這裏不需要進行長度檢查)。如果我正在構造一個由兩個以上的東西組成的字符串,或者不確定長度,我可能會切換,但在這種情況下我不認爲是必要的。 – paxdiablo 2012-01-16 02:38:18

+0

這一切聽起來都很複雜,malloc,多個調用等 - 其中一個snprintf將處理MAX_PATH大小的堆棧上的數組(而不是100%確定該宏的可移植性)並且實際上OP應該使用系統調用創建目錄 - 因爲它受限於使用系統調用,但沒有一些奇怪的副作用,對OS – 2012-01-16 02:50:21

0

你需要建立一個字符串w /你的完整命令發送到它的system(),這意味着爲它分配空間(你沒有在你的原始代碼中進行名稱操作,這樣你的呼叫scanf可能會失敗)。對於像你的mkdir例子那樣的東西,你可以創建一個以mkdir開頭的字符串&在你的目錄名稱後面有足夠的空間,當你調用scanf時,將它指向你想要名稱的字符串中的位置;節省你不得不做一個strcat或之後的某些東西,如果這是你唯一需要的目錄名稱,爲什麼要存儲它兩次?

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'來確保你不能溢出你的緩衝區,不管你認爲「足夠大」有多大。 – 2012-01-16 02:27:26

+2

由於我限制輸入少於100個字符,而'strlen(「mkdir」)'小於20,所以這是安全的。在其他情況下,'snprintf()'會更好。 – 2012-01-16 02:29:31

+0

非常好的解決方案。 – 2014-03-23 11:06:34

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),它無處不在。 – 2012-01-16 02:56:30

相關問題