用字符串

时间:2017-05-10 12:05:29

标签: c

我的程序将收到类似

的命令
  

./ 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,以及其他一些测试),但我没有得到正确的结果,似乎忽略了值。

有人能指出我的错误吗?

1 个答案:

答案 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 ...