使用指针遍历 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;
}
我想使用下面的代码,但不使用“[][]”索引数组并用指针替换它
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;
}