双指针char操作

时间:2012-03-25 13:53:15

标签: c arrays string argv

假设我有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个字符(或字节)。如果是这样,我如何将指针增加到下一个数组并打印出该字符串?

5 个答案:

答案 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。请注意,如果argvmain函数的参数,则它是可修改的,您可以像这样使用它:

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

然后你想要概括成一个循环。