假设我有char **argv
。
首先,如何打印argv
中的所有字符串?我尝试了以下方法:
char *temp;
temp = *argv; // Now points to the first string?
while (temp != NULL) {
printf("%s ", temp);
temp++;
}
在这里,当temp
递增时,它只会跳过一个字符。为什么会这样?我知道argv
是一个包含点的数组。每个指针指向char*
的数组。如果是这样,为什么这不起作用?我知道,因为temp
的类型为char
,所以递增该指针会使其增加1
个字符(或字节)。如果是这样,我如何将指针增加到下一个数组并打印出该字符串?
答案 0 :(得分:6)
您需要增加argv
,而不是*argv
。使用本地副本,如下所示:
for (char ** p = argv; *p; ++p) // or "*p != NULL"
{
char * temp = *p; // now points to the first string!
printf("%s ", temp); // or just "printf("%s", *p);"
}
答案 1 :(得分:6)
它只跳过一个字符,因为temp
是指向char
的指针。通过添加一个,您告诉编译器将指针移动到指向内存中的下一个char
。
argv
是一个指针数组。您需要做的是在每次迭代时转到下一个指针。类似的东西:
char **temp = argv; // temp is a pointer to a *pointer*, not a pointer to a *char*
while (*temp != NULL) {
printf("%s ", *temp);
temp++;
}
答案 2 :(得分:1)
首先,您需要了解char** argv
是什么。它是一个指向char的指针数组。该阵列中的指针不必位于地址空间中彼此靠近的任何地方。你想要的是这个:
char** temp;
temp = argv;
while(temp != argv + argc) {
printf("%s ", temp);
temp++;
}
你需要有一个指向数组第一个元素的指针指向char。相反增加。
答案 3 :(得分:0)
您必须增加argv
而不是*argv
。请注意,如果argv
是main
函数的参数,则它是可修改的,您可以像这样使用它:
while (*argv++) {
printf("%s\n", *argv);
}
答案 4 :(得分:0)
您可能想要做的是:
char* a = argv[0]; // first arg
char* b = argv[1]; // second arg
char* c = argv[2]; // third arg
相当于:
char* a = *(argv + 0);
char* b = *(argv + 1);
char* c = *(argv + 2);
然后你想要概括成一个循环。