在windows上使用cmd提示符进行C编程 #包括 #包括 #包括 #包括 int main(){ char命令[20]; 系统(“dir”); 而(1){ printf(“\n\n”); scanf(“%s”,命令(&C); 系统(指挥部); } 返回0; }

在windows上使用cmd提示符进行C编程 #包括 #包括 #包括 #包括 int main(){ char命令[20]; 系统(“dir”); 而(1){ printf(“\n\n”); scanf(“%s”,命令(&C); 系统(指挥部); } 返回0; },c,system,C,System,这是我的代码,这是一个用C编写的控制台应用程序,我希望能够控制我的计算机的cmd提示符,每当我运行新命令,如cd..路径总是回到它以前的位置,我如何使它像一个进程?对不起,我是新手。你不能 典型命令行解释器中的cd命令是一个内部命令,即内置于命令解释器本身。这是因为当前目录是进程本身的一个属性,而子进程(在大多数情况下是system()创建的)无法更改其父进程的当前目录。您需要自己执行此操作:将cd传递到system(…)将不再起作用,因为您自己的代码是在命令shell的控制下运行的,它相信当前

这是我的代码,这是一个用C编写的控制台应用程序,我希望能够控制我的计算机的cmd提示符,每当我运行新命令,如
cd..
路径总是回到它以前的位置,我如何使它像一个进程?对不起,我是新手。

你不能


典型命令行解释器中的
cd
命令是一个内部命令,即内置于命令解释器本身。这是因为当前目录是进程本身的一个属性,而子进程(在大多数情况下是
system()
创建的)无法更改其父进程的当前目录。

您需要自己执行此操作:将
cd
传递到
system(…)
将不再起作用,因为您自己的代码是在命令shell的控制下运行的,它相信当前目录就是您开始运行程序时的目录

它是命令shell的一项任务,
cmd
,用于跟踪当前目录。由于您正在编写命令shell,因此需要跟踪目录树中的当前位置


您还需要将位置传递给正在运行的每个命令。不过,这项任务变得非常棘手,远远超出了简单的传递代码。

我使用了一个小技巧,效果很好。让我们想象一下,您想启动一个位于
“C:/Program Files”
中的应用程序


我想这应该是一个副本,但找不到任何副本。+1,当然,您可以:编写一个命令行解析器,它可以处理像
cd
本身这样的“内置项”,并使用
CreateProcess()
(在windows上,或在*nix系统上
fork()
/
execlp()
)转发任何其他内容。现在,创建自己的
cmd.exe
(又名shell);)
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main(){
    char command[20];

    system("dir");

    while(1){
    printf("\n\n");
    scanf("%s", &command);
    system(command);
    }

    return 0;
}
const char applicationPath[] = "cd C:/Program Files/App&&";

bool sytemCallsToApp(void) {
    char cmd[200] = "";
    strcpy(cmd, applicationPath); // cmd to access app
    strcat(cmd, "app.exe");
    strcat(cmd, "&&HERE YOUR NEXT COMMAND"); // This command will be concatenated after the && thus executed just after cd
    if (system(cmd) != 0)
        return false; // If failed exit

    // Use strcpy to modify the content of cmd[]
    // Use strcat to add instructions to cmd
    // Add && when you want to execute multiple cmd in one system call
    // Don't forget system() returns values depending of your calls. It'd be wise to check them.
    return true;
}