如何使用指针在数组中显示字符串?

时间:2009-03-18 16:36:07

标签: c pointers string

我正在练习使用指针。

我有一个指向3个字符串数组的指针:“dog”,“cat”,“rat”。

我可以使用for循环并使用数组打印内容。

但是,我在使用指针算法打印它们时遇到问题。我想将指针递增到数组中的下一个元素。然而,它所做的只是打印狗牌。

代码:

int main(int argc, char **argv)
{
    char *str[3] = { "DOG", "CAT", "RAT"};
    int i = 0;

    /* display using an array element */
    for(i = 0; i < 3; i++)
    {
    printf("str: %s\n", str[i]);
    }

    /* display using a pointer arthimatic */
    while((*str)++)
    {
    printf("str: %s\n", str);
    }

    getchar();

    return 0;
}

我该如何做到这一点?

编辑:

代码:

while(str)
{
    printf("str: %s\n", *(str++));
}

但是,我收到此错误消息。 I值是否必须是某种变量?

错误C2105:'++'需要l值

5 个答案:

答案 0 :(得分:13)

你首先必须得到一个指针,你需要一个什么时候停止。可以使用最后一个NULL指针。所以代码变成了

char *str[] = { "DOG", "CAT", "RAT", NULL };
char **elem_p = str;

/* display using a pointer arthimatic */
while(*elem_p) {
    printf("str: %s\n", *elem_p);
    elem_p++;
}

你所做的是增加存储在数组第一个元素中的指针。该指针永远不会太快等于空指针(如果有的话),所以,循环不会停止,直到指针的内部值溢出或其他事情发生,以便它等于空指针。然后,将指向数组的第一个元素的指针传递给printf(传递数组,但编译器会将其转换为指针 - 见下文)。 Printf会将这些指针的字节解释为字符并打印出来,如果它不立即崩溃,将导致打印出垃圾。

您希望在更高级别递增:增加数组的一个元素(指针),但指向元素本身的指针。现在,你做不到

str++

因为str是一个数组。它不是指针,即使它可以转换为指针,然后指针指向它的第一个元素。因此,我们创建一个最初指向str[0]的指针,但再次增加它。请注意,我们在打印后递增它,以便我们也打印出第一个元素。

实际上,我想我应该解释为什么你不能做str++。好吧,str是一个数组。数组是占用一定数量存储空间的对象。在上面,数组占用char指针4 * sizeof(char*)大小的4倍。乍一看看起来像指针的是同一类型的元素块。对于寻址元素,编译器可以在表达式中组成一个数组中的指针,然后可以用它来寻址数组中的元素。如果执行str++,编译器将为您创建指针。但是这个指针是暂时的,只是暂时存在,其目的只是为了立即对它做一些事情,但它不能像增加一样改变。这就是我们创建一个真正的指针变量然后可以递增的原因。

答案 1 :(得分:1)

你的代码的问题在于你正在递增解除引用的指针str,它为数组中的第一个元素(即dog)提供了一个char *。

你应该增加str本身,而不是指向它。

然而,在这种情况下,你的循环终止检查将不起作用,因为当前str == 0的数组中没有元素成立。为了使其工作,您需要向数组添加第四个元素,即0。

答案 2 :(得分:1)

(*str)++

增加s指向的值。您将需要递增指针本身并打印指针的值。注意,str不是l值,也不能递增。

此外,如果您先增加,那么您只剩下两个可以打印的合法字符串。之后你调用UB。

试试这个:

int main(void)
{
    /* we have added a sentinel to mark the end of the array */
    char *str[] = { "DOG", "CAT", "RAT", 0 };
    /* since str is an array, you cannot use it to loop, have a walker */
    char **w = str;

    /* display using a pointer arthimatic */
    while(*w)
    {
        printf("str: %s\n", *w++);
    }


    return 0;
}

在C中查找运算符优先级和绑定。

答案 3 :(得分:1)

str,作为一个数组,不能递增。

现在,您正在递增(*str),即str[0]:该数组的第一个元素。由于此元素是指针,因此您将增加指针,使其引用字符串“DOG”的后续元素。

你需要的是一个可以指向(并因此遍历)str元素的指针。由于元素是char*,指向它们的指针将是char** - 双指针。

答案 4 :(得分:0)

while((*str)++)    
{        printf("str: %s\n", str);    }

这增加* str,即字母'd'。你不想那样做。你想增加指针。这段代码应该做你想要的:

while((str)++)    
{        printf("str: %s\n", str);    }