如何在c中使用system()中的变量

时间:2012-01-16 02:16:07

标签: c

请帮我处理我的代码。我在c中使用system()函数。假设我想使用C代码创建一个新目录。

char name[];

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

然后使用system(),我想使用变量name[] 而不是像system("mkdir ryan");那样使用或放置一个固定值,而是创建一个新目录ryan;我想要发生的是,创建任何目录名称并将其存储到变量name[]并实现该值而不是ryan。非常感谢您的回答。

5 个答案:

答案 0 :(得分: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 :(得分:1)

首先关闭(如果你的代码只是一个例子,这可能并不重要),不要使用无界%s scanf - 这会打开你的缓冲区溢出。

如果你有一个字符串:

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失败,您可能希望在那里进行一些错误检查。)

答案 2 :(得分: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;
}

答案 3 :(得分:0)

你需要建立一个字符串w /你的完整命令发送到它的system(),这意味着为它分配空间(你没有为原始代码中的名字做,所以你的电话扫描可能会失败)。对于类似mkdir示例的内容,您可以创建一个以mkdir&amp;开头的字符串。在那之后有足够的空间用于你的目录名,当你调用scanf时,将它指向你希望名字去的那个字符串中的位置;保存你不得不做一个strcat或之后的事情,如果这是你唯一需要的目录名,为什么要存储两次呢?

答案 4 :(得分:-3)

尝试:

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