使用指针迭代argv []

时间:2015-06-24 01:02:41

标签: c arrays argv

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

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

我知道您可以使用指针遍历数组,但我不确定如何在第二个数组中使用未定义的长度,在这种情况下是来自输入的字符串。由于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;
    }
}

6 个答案:

答案 0 :(得分:5)

鉴于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位于参数列表的末尾,这是错误的。 <{1}}将在每个字符串的末尾*p,这是假的。

来自N1256 5.1.2.2.1 / 2

  

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

     

- argc的值应为非负值。

     

- argv [argc]应为空指针。

答案 1 :(得分:4)

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

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

内部循环使用p作为循环变量,使用常规p++递增,并使用*p != '\0'进行检查。循环条件可以缩短为*p,因此内部循环看起来像这样:

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

答案 2 :(得分:2)

是的,您可以使用指针迭代argv

内部循环告诉p指向argv+i的开头并迭代它直到它到达\0

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

答案 3 :(得分:1)

您可以使用任何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;

}

答案 4 :(得分:0)

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

答案 5 :(得分:-1)

请记住,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;
}