我想使用以下代码,但不使用" [] []"对数组建立索引。并用指针替换它
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;
}
}
答案 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;
}