使用指针遍历 argv[]

Using pointers to iterate through argv[]

我想使用下面的代码,但不使用“[][]”索引数组并用指针替换它

for (int i = 0; i < argc; i++) {
    for (int j = 0; argv[i][j] != '[=10=]'; j++) {
        //code
    }
}

我知道您可以使用指针遍历数组,但我不确定如何在第二个数组中使用未定义的长度(在本例中为来自输入的字符串)。由于 argv[] 的每个元素可以有不同的长度,我想确保我可以正确读取字符并知道 argv[] 的每个元素何时结束,下一个元素何时开始。

我希望它是这样的:(如果以下 header 到 main 是错误的,请告诉我。)

int main(int argc, char **argv) {
    for (int i = 0; i < argc; i++) {
        while(argv != '[=11=]') {
            //code
            *argv+1;
        }
        //to skip null character
        argv+1;
    }
}

因为 for 循环允许任何类型的值,对于您的 "loop index" 不一定是整数,您的循环可以这样重写:

for (char **a = argv ; a != argv+argc ; a++) {
    for(char *p = *a ; *p != '[=10=]' ; p++) {
        // code uses *p instead of argv[i][j]
    }
}

内循环使用p作为循环变量,用正则p++递增,用*p != '[=15=]'校验。循环条件可以缩短为 *p,因此内部循环将如下所示:

for(char *p = *a ; *p ; p++)

请记住 argv[] 本质上是一个指针数组,这意味着 *(argv+i) 会将 i * 指针大小添加到基地址(在本例中为 argv )并将其阻止到指向字符串的指针。然后,您可以随意操纵每个指向字符串的指针。以下代码是打印出 argv 中所有字符串的示例:

int main(int argc, char *argv[]){
     int i;
     for(i = 0; i < argc; i++)
         printf("%s\n", *(argv+i));
     return 0;
}

是的,您可以使用指针遍历 argv

内部循环告诉p指向argv+i的开头并遍历它直到到达[=15=]

#include <stdio.h>
int main(int argc, char **argv) {
    int i;
    char *p;
    for(i=0; i < argc; i++) {
        for(p=*(argv+i); *p; p++)
            printf("%c", *p);
        printf("\n");
    }
}

如果你只对遍历每个参数感兴趣,而不对解析每个字符感兴趣,那么你可以简单地。

#include <stdio.h>
int main(int argc, char **argv) {
    int i;
    char *p;
    for(i=0; i < argc; i++) {
        printf("Argument position %d is %s\n", i, *(argv+i));
    }
}

您可以使用任何 any_t * 来迭代任何 any_t[],在这种情况下:

int main(int argc, char **argv) {

  char **i = argv; //iterator of argv
  char **e = argv + argc; //end of argv

  for(; i != e; ++i) {

    char *j = *i; //iterator of *i

    //condition: *j mean *j != 0
    for(; *j; ++j) {
      printf("%c", *j);
    }

    printf("\n");

  }

  return 0;

}

鉴于 argv 中的最后一个元素是 NULL,如果您真的不想,则不需要对其进行索引或与 argc 进行比较。

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);
    }
  }
}

*arg 将是 NULL 在参数列表的末尾,这是错误的。 *p 将在每个字符串的末尾 '[=17=]',这是错误的。

来自 N1256 5.1.2.2.1/2

If they are declared, the parameters to the main function shall obey the following constraints:

— The value of argc shall be nonnegative.

— argv[argc] shall be a null pointer.

#include <stdio.h>
int main(int argc, char **argv)
{
    printf("%i\n",argc);
    while (*argv != NULL) {
        printf("%s\n",*argv);
        argv++;
    }
    return 1;
}