【问题标题】:How can I translate this loop into a for loop?如何将此循环转换为 for 循环?
【发布时间】:2023-04-01 21:17:01
【问题描述】:

我正在尝试将此循环转换为 for 循环,但我无法让它工作,它在 C 中。

while(args[argCounter]){
        if(!strcmp(args[argCounter], "|")){
            args[argCounter] = NULL;
            cmdbegin[child] = argCounter + 1;
            child++;
        }
        argCounter++;
}

【问题讨论】:

  • 看看for 循环是如何工作的:for( initial_condition; condition_to_keep_looping; what_to_do_after_each_iteration)。在这里,想想argCounter。您必须为其设置一个初始值,因此您可以将其设置为初始条件。每次迭代结束时你会做什么?你增加argCounter。在什么情况下你会一直循环?
  • 嗯...for (int argCounter = 0; args[argCounter]; ++argCounter) { ... }

标签: c for-loop while-loop


【解决方案1】:

或者

char **tmp = args + argCounter;
for(;*tmp;tmp++)
{
    ++argcounter;
    if (!strcmp(*tmp, "|")) {
    *tmp = NULL;
    cmdbegin[child++] = argCounter;
}

【讨论】:

  • 值得注意的是,您的代码示例虽然非常漂亮(以至于我赞成它),但并没有完全按照 OP 的要求做。即使不输入 if,argCounter 也应该递增。您可以将它放在 for 的最右边部分,使用比较(以性能为代价),或者简单地将增量放在 if 之前。 ;) 仍然喜欢阅读您的回答,祝您有美好的一天!
【解决方案2】:

我会这样翻译:

for (int argCounter = 0 ; args[argCounter] ; argCounter++){
    if(!strcmp(args[argCounter], "|")){
        args[argCounter] = NULL;
        cmdbegin[child++] = argCounter + 1;
    }
}

我添加了您没有显示的argCounter 的声明和初始化。转换非常机械:

  • argCounter++ 移动到 for 循环头的第三个“隔间”,
  • 我将child++ 移动到分配中以稍微缩短代码;这是可选的。

【讨论】:

    【解决方案3】:

    argCounter 的初始值未在您的代码中指定。这是一个转换:

    for (; args[argCounter]; argCounter++) {
        if (!strcmp(args[argCounter], "|")) {
            args[argCounter] = NULL;
            cmdbegin[child] = argCounter + 1;
            child++;
        }
    }
    

    如果循环从 0 开始,并且您想让 argCounter 本地化到 for 循环,这里是 C99 版本:

    for (int argCounter = 0; args[argCounter]; argCounter++) {
        if (!strcmp(args[argCounter], "|")) {
            args[argCounter] = NULL;
            cmdbegin[child] = argCounter + 1;
            child++;
        }
    }
    

    【讨论】:

    • @Arturo:您可以通过单击其分数下方的灰色复选标记来接受其中一个答案,并在获得足够声誉时为您想要的答案投票。
    猜你喜欢
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    相关资源
    最近更新 更多