我的程序将收到类似的命令
./a.out echo $3 $1 ">" log.txt
我需要将 $3 替换为 3 和 1,以便在从标准输入读取时使用后者,此时我的代码如下(此时它只针对一个 $n 执行操作):
int total = argc-1;
int coluna =0;
int i,n,cut,s, pid,status;
char *cmd[total];
char buffer[PIPE_BUF];
char col[10];
char field[10];
//passar argumentos para array
for(i=0;i<total;i++) {
if(i+1 == total) cmd[total+1] = NULL;
else cmd[i] = argv[i+1];
}
//verify for $n
char *tmp = cmd;
for(i=0;i<total-1;i++) {
if(sscanf(tmp,"[$]%s",col) == 1) coluna = atoi(col);
}
代码执行的其他所有内容都有效(在没有 $n 和其他一些测试的情况下尝试过),但我没有得到正确的结果,似乎它忽略了该值。
有人可以指出我的错误吗?
最佳答案
您重复覆盖coluna
:
for(...)
{
if(sscanf(...) == 1)
coluna = atoi(col); // <--
}
我无法弄清楚你到底想要实现什么,如果你只想获得第一个这样的值(因此名称为“coluna”?),那么只需break
你的循环:
if(sscanf(...) == 1)
{
coluna = atoi(col);
break;
}
否则,请直接在此处使用 coluna,而不是破坏值或将值存储在数组中,如下所示。假设每个参数都可能包含 $n
:
int cols[argc-1]; // assuming you checked for argc > 1 already!
int numCols = 0;
if(sscanf(...) == 1)
cols[numCols++] = atoi(col);
旁注:这两段代码:
int total = argc-1;
for(i=0;i<total;i++) {
if(i+1 == total) cmd[total+1] = NULL;
else cmd[i] = argv[i+1];
}
可以通过简单地执行以下操作来替换:
--argc;
++argv;
除非您出于某种原因确实需要副本(例如将修改后的 cmd 与原始 argv 进行比较)。如果按上述方式修改 argc/argv,则可以像使用 cmd/total 一样使用 argc 和 argv。要保留名称,您甚至可以将 argc 重命名为 Total,将 argv 重命名为 cmd...
关于c - 将 $n 替换为字符串中的 n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43892011/