【问题标题】:How can I use pointers to display strings in an array?如何使用指针在数组中显示字符串?
【发布时间】:2009-03-18 16:36:06
【问题描述】:

我正在练习使用指针。

我有一个指向 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:“++”需要左值

【问题讨论】:

  • 最好不要增加 str,而是使用 str 初始化的循环变量,这样您以后可以再次访问 str。字符 *循环 = str;而(循环)...
  • 在下面查看我的答案:指出您收到该错误的原因。

标签: c pointers string


【解决方案1】:

您首先必须获得一个指针,并且您需要一个何时停止的条件。可以为此使用最后一个 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 倍,4 * sizeof(char*)。乍一看像指针的东西是同一类型的元素块。对于寻址元素,编译器可以从表达式中的数组组成一个指针,然后可以使用该指针来寻址数组中的元素。如果您执行str++,编译器将为您创建一个指针。但是那个指针是临时的,只存在一小段时间,唯一的目的是立即用它做某事,但它不能像增加一样被改变。这就是我们创建一个真正的指针变量的原因,然后我们可以递增。

【讨论】:

  • char *str[3] = { "DOG", "CAT", "RAT", NULL };在这里我得到一个错误“太多初始化”我应该将元素更改为 *str[4]?
  • 哎呀,是的,请:) 最好把它留空。数组大小将自动计算。
  • 我误读了您的代码。我以为你做了 printf("str: %s\n", *str);这将打印 OG、G 等。现在只有 str,我希望它打印垃圾(因为它会将指针解释为字符)。
  • 你好,char *animals[] = {"dog", "cat", 0}有什么区别;和 int numbers[] = {1, 2, 3};为什么我需要 * 来表示 char。我不需要 int 吗?使用 *animals[]。我正在创建 1 个指向数组中多个不同元素的指针?谢谢
  • 运算符[] 和运算符* 的优先级。 char *p[] 被解读为将 p 声明为“...的数组”。做一个“指向...数组的指针”,你做 char (*p)[] 。但这在您的代码中没有意义。它在多维数组中很有用。但我怀疑此时它比帮助更令人困惑。
【解决方案2】:

您的代码的问题在于您正在递增取消引用的指针 str,这为您提供了一个 char * 到数组中的第一个元素(即 dog)。

您应该增加 str 本身,而不是它指向的内容。

但是,在这种情况下,您的循环终止检查将不起作用,因为此时数组中没有元素 str == 0 成立。为了让它工作,你需要向数组中添加第四个元素,即 0。

【讨论】:

    【解决方案3】:

    str为数组,不能自增。

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

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

    【讨论】:

      【解决方案4】:
      (*str)++
      

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

      另外,如果你先递增,那么你只剩下两个可以打印的合法字符串。之后你调用 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 中查找运算符优先级和绑定。

      【讨论】:

        【解决方案5】:
        while((*str)++)    
        {        printf("str: %s\n", str);    }
        

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

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

        【讨论】:

        • str 是数组的名称。不能递增。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 2013-10-22
        • 1970-01-01
        • 2010-12-05
        • 2011-08-27
        • 1970-01-01
        相关资源
        最近更新 更多