我的程序将收到类似
的命令./ a.out echo $ 3 $ 1“>” log.txt的
我需要用3和1替换3美元,以便在从stdin读取时使用后者,此时我的代码就像这样(此时它只为一个$ 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,以及其他一些测试),但我没有得到正确的结果,似乎忽略了值。
有人能指出我的错误吗?
答案 0 :(得分:1)
您反复覆盖coluna
:
for(...)
{
if(sscanf(...) == 1)
coluna = atoi(col); // <--
}
我无法弄清楚你想要实现的目标,如果你只想获得第一个这样的值(因此名称&#34; coluna&#34;?),那么只需{{ 1}}你的循环:
break
否则,请直接在此处使用coluna,而不是将值分解或存储在数组中,如下所示。假设每个参数可能包含if(sscanf(...) == 1)
{
coluna = atoi(col);
break;
}
:
$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];
}
除非您确实需要任何理由副本(例如将修改后的cmd与原始argv进行比较)。如果您如上所述修改argc / argv,则可以像使用cmd / total一样使用argc和argv。要保留名称,您甚至可以将argc重命名为total,将argv重命名为cmd ...