使用指针迭代argv []

Bla*_*ter 6 c arrays argv

我想使用以下代码,但不使用"[] []"索引数组,并用指针替换它

for (int i = 0; i < argc; i++) {
    for (int j = 0; argv[i][j] != '\0'; j++) {
        //code
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道你可以使用指针来遍历一个数组,但我不确定如何在第二个数组中使用未定义的长度,在这种情况下是来自输入的字符串.由于argv []的每个元素可以有不同的长度,我想确保我能正确读取字符并知道argv []的每个元素何时结束,然后下一个元素开始.

我希望它是这样的:(如果以下标题为main错误,请告诉我.)

int main(int argc, char **argv) {
    for (int i = 0; i < argc; i++) {
        while(argv != '\0') {
            //code
            *argv+1;
        }
        //to skip null character
        argv+1;
    }
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 5

由于for循环允许任何类型的值,不一定是您的“循环索引”的整数,您的循环可以像这样重写:

for (char **a = argv ; a != argv+argc ; a++) {
    for(char *p = *a ; *p != '\0' ; p++) {
        // code uses *p instead of argv[i][j]
    }
}
Run Code Online (Sandbox Code Playgroud)

内循环p用作循环变量,它随常规 递增p++,并用 进行检查*p != '\0'。循环条件可以缩短为*p,因此内部循环将如下所示:

for(char *p = *a ; *p ; p++)
Run Code Online (Sandbox Code Playgroud)

  • @BlakeLassiter 谁说这都是线性一维数组? (2认同)

Rya*_*ing 5

鉴于其中的最后一个元素argvNULLargc如果您真的不想创建索引,则无需对其进行索引或比较。

int main(int argc, char *argv[]) {
  for (char **arg = argv; *arg; ++arg) { // for each arg
    for (char *p = *arg; *p; ++p) {      // for each character
      process(*p);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

*argNULL位于参数列表的末尾,这是错误的。 *p'\0'在每个字符串的末尾,这是错误的。

从N1256 5.1.2.2.1 / 2

如果声明了它们,则主函数的参数应遵循以下约束:

— argc的值应为非负数。

— argv [argc]应为空指针。