【问题标题】:How do I loop over a char pointer in C?如何在 C 中遍历 char 指针?
【发布时间】:2019-11-26 15:49:09
【问题描述】:

我正在尝试访问“c”中此预初始化 char 指针的所有元素。代码如下:

#include <stdio.h>
#include <stdlib.h>

void main()
{
    char **s="Hello";
    printf("%c",*(*&s+1));
}

这段代码应该输出“e”,但没有。我做错了什么?

另外,如何逐个访问所有元素?

【问题讨论】:

  • 我要一个一个访问所有元素。
  • 这可以编译吗?没有警告?请编辑并添加一个问题。你现在只提到了你正在尝试做的事情,但没有提到哪里出了问题。或者这个“e”是什么
  • 这给了我更多关于有代码行的警告。这里有一个提示:如果你想使用 %c 说明符单独打印 "Hello" 的所有字符,你需要一个循环。
  • 始终使用编译器的警告并引导它们。对于gcc,我使用-Wall -Wextra -pedantic。这样就发现问题了。
  • @SamiKuhmonen 不,它会发出类似警告的警告:从不兼容的指针类型初始化 [-Wincompatible-pointer-types] char **s="Hello";

标签: c pointers


【解决方案1】:

s 的类型不正确。字符串常量"Hello" 具有数组类型,可以衰减为char * 类型,但您将其分配给char ** 类型的变量。

s的类型改为char *,你的代码会输出“e”:

 char *s = "Hello";

另外,看看这个:

*(*&s+1)

* 正好在&amp; 之前出现时,它们会相互抵消。因此,您可以将其简化为:

*(s+1)

或等价:

s[1]

【讨论】:

    【解决方案2】:

    假设您没有看到 Hello 的“e”,我强烈建议您观看这篇文章。

    What to do when the pointer doesn't print the string properly

    总结一下,当你引用指针 s 时,它只是读取 Hello 的 H(因为这就是字符串指针的工作方式——它指向字符串的第一个字符,如 s[0]),这会导致您的代码仅打印出 H 。

    最重要的是,你的指针是双指针,这是不正确的。

    用这种方法试试。

    #include <stdio.h>
    #include <stdlib.h>
    void main()
    {
      char s[] = "Hello";
      printf("%s\n",s);
    }
    

    【讨论】:

      猜你喜欢
      • 2017-03-19
      • 2013-03-22
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 2016-11-12
      • 2015-08-12
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多