【问题标题】:Using parameters from command line in a system command在系统命令中使用命令行参数
【发布时间】:2013-04-01 21:40:20
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
main(int argc,char *argv[]){
int i,j;
for (i=0;i<argc;i++){
printf("Name: %s\n",argv[i]);
    char name[100];
    sprintf(name,"echo"| rev, argv[i]);
    system(name);

}

};

我有这个,我的问题是如何反转名称存储在 argv[i] 中的文件, 我想要的是执行一个执行此命令“rev argv[i]”的子进程?

谢谢!

【问题讨论】:

  • 请使用snprintf而不是sprintf(并检查返回值以确定是否发生截断)。

标签: c unix system reverse


【解决方案1】:

觉得需要换行sprint()

sprintf(name,"rev %s", argv[i]);

嗯,你也应该在正确的参数上这样做,对所有参数都这样做可能不是你想要的。

【讨论】:

  • 感谢您回答修改文件中的更改?像 "sprint(name,"rev %s>%s",argv[i])" 之类的东西?
【解决方案2】:

您有正确的想法来使用sprintf。但它需要一个格式说明符,就像printf 一样。而| 是一个按位或运算符,在这里没有任何意义(如果它被定义,它会产生一个 mutilated 指针)。

snprintf(name, sizeof(name), "rev %s", argv[i]);

如果你想修改名称在arg[i] 中的文件,你不能只将输出重定向到同一个文件,因为shell(system 用来执行命令)同时打开这两个文件并且打开文件进行写入会截断其长度。因此,您需要将输出重定向到不同的文件,然后在单独的命令中复制回原始文件。

snprintf(name, sizeof(name), "rev %s > %s.modified", argv[i], argv[i]);
system(name);
snprintf(name, sizeof(name), "mv %s.modified %s", argv[i], argv[i]);
system(name);

【讨论】:

    【解决方案3】:

    请确认您对 sprintf 的使用

    它必须带有一个字符串,它显示了一些不纯的东西! 检查相同。

    【讨论】:

      猜你喜欢
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 2012-01-20
      • 1970-01-01
      • 2012-06-03
      • 2011-03-12
      • 2011-03-29
      相关资源
      最近更新 更多