C语言运行脚本程序方法

注意:执行的命令中带有双引号的话,一定要加 '\'进行转义

1.返回执行状态码:

command参数为需要执行的命令   

int executeCommand_noreq(char* command)
{
    int returnValue;   // 保存命令执行后的返回值
    returnValue = system(command); // 调用system()函数执行命令并将返回值保存到returnValue变量中
    if (WIFEXITED(returnValue)) { // 判断命令是否正常退出
        int exitStatus = WEXITSTATUS(returnValue); // 获取命令的退出状态(返回值)
        return exitStatus;
    } else {
        return -1;
    }
}

2.返回命令执行结果的输出:

command参数为需要执行的命令语句,result为malloc的一段内存串

也可以在本函数中malloc,就需要改一改函数,返回这个result

不管在函数内或外,都记得释放掉该内存

void executeCommand(char* command,char* result)
{
//    char* result = malloc(COMMEND_BUFSIZE); // 分配一块内存来存储结果
    memset(result, 0, COMMEND_BUFSIZE); // 初始化为0,以防数据残留
    // 执行命令并将标准输出连接到文件流中
    FILE* fp = popen(command, "r");
    if (!fp)
    {
        perror("popen failed");
        return ;
    }
    // 读取文件流中的数据
    char buf[COMMEND_BUFSIZE]={0};
    memset(buf, '\0', COMMEND_BUFSIZE);
    while (fgets(buf, COMMEND_BUFSIZE, fp))
    {
        if(strlen(result) + strlen(buf) > COMMEND_BUFSIZE){
            printf("shell返回结果超出buffer size,进行截断\n");
            break;
        }
        strcat(result, buf); // 将读取到的数据添加到结果中
    }
    int  st=pclose(fp);
    if(st==-1)
    {
        return ;
    }
    result[strlen(result)-1] = '\0';
    return ;
}

 

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
推箱子游戏是一种经典的益智游戏,这里提供一个简单的 Linux 命令行版本的推箱子游戏实现。实现过程中使用了 C 语言和 ncurses 库。 首先,我们需要定义一些常量来表示地图元素: ```c #define WALL '#' // 墙 #define BOX '$' // 箱子 #define TARGET '.' // 目标点 #define MAN '@' // 人物 #define SPACE ' ' // 空白 ``` 接着,我们需要定义地图的结构体,包含地图的宽度、高度、人物位置、箱子位置、目标点位置以及地图数据。 ```c typedef struct { int width; // 地图宽度 int height; // 地图高度 int man_x, man_y; // 人物位置 int box_x, box_y; // 箱子位置 int target_x, target_y; // 目标点位置 char *data; // 地图数据 } Map; ``` 接下来,我们需要实现一些基本的操作函数,如初始化地图、绘制地图、移动人物和箱子等。 初始化地图函数 `init_map` 如下: ```c void init_map(Map *map, const char *data, int width, int height) { int i, j; map->width = width; map->height = height; map->data = (char *)malloc(sizeof(char) * width * height); for (i = 0; i < height; i++) { for (j = 0; j < width; j++) { map->data[i * width + j] = data[i * width + j]; if (data[i * width + j] == MAN) { map->man_x = j; map->man_y = i; } else if (data[i * width + j] == BOX) { map->box_x = j; map->box_y = i; } else if (data[i * width + j] == TARGET) { map->target_x = j; map->target_y = i; } } } } ``` 绘制地图函数 `draw_map` 如下: ```c void draw_map(const Map *map) { int i, j; for (i = 0; i < map->height; i++) { for (j = 0; j < map->width; j++) { if (i == map->man_y && j == map->man_x) { mvaddch(i, j, MAN); } else if (i == map->box_y && j == map->box_x) { mvaddch(i, j, BOX); } else if (map->data[i * map->width + j] == TARGET) { mvaddch(i, j, TARGET); } else if (map->data[i * map->width + j] == WALL) { mvaddch(i, j, WALL); } else { mvaddch(i, j, SPACE); } } } refresh(); } ``` 移动人物函数 `move_man` 如下: ```c void move_man(Map *map, int dx, int dy) { int new_x = map->man_x + dx; int new_y = map->man_y + dy; if (new_x < 0 || new_x >= map->width || new_y < 0 || new_y >= map->height || map->data[new_y * map->width + new_x] == WALL) { return; } if (new_x == map->box_x && new_y == map->box_y) { int new_box_x = map->box_x + dx; int new_box_y = map->box_y + dy; if (new_box_x < 0 || new_box_x >= map->width || new_box_y < 0 || new_box_y >= map->height || map->data[new_box_y * map->width + new_box_x] == WALL || (new_box_x == map->box_x && new_box_y == map->box_y)) { return; } map->box_x = new_box_x; map->box_y = new_box_y; } map->man_x = new_x; map->man_y = new_y; } ``` 最后,我们需要编写主函数,不断读取用户输入并执行相应的操作。 ```c int main(int argc, char *argv[]) { const char *map_data = "######\n" "# #\n" "# #\n" "#@$ #\n" "# #\n" "# #\n" "######\n"; int width = 6; int height = 7; Map map; init_map(&map, map_data, width, height); initscr(); // 初始化 ncurses 库 cbreak(); // 禁止缓冲,直接读取输入 noecho(); // 不回显输入字符 keypad(stdscr, TRUE); // 开启功能键支持,如方向键 while (1) { clear(); // 清屏 draw_map(&map); int ch = getch(); // 读取用户输入 switch (ch) { case KEY_UP: move_man(&map, 0, -1); break; case KEY_DOWN: move_man(&map, 0, 1); break; case KEY_LEFT: move_man(&map, -1, 0); break; case KEY_RIGHT: move_man(&map, 1, 0); break; case 'q': goto end; // 跳转到程序结束 break; } if (map.box_x == map.target_x && map.box_y == map.target_y) { // 箱子到达目标点,游戏胜利 mvprintw(height + 1, 0, "You win!"); getch(); // 等待用户输入 goto end; // 跳转到程序结束 } } end: endwin(); // 结束 ncurses 库 return 0; } ``` 这样,一个简单的 Linux 命令行版本的推箱子游戏就完成了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值