【问题标题】:Declaration of a String of Dynamic Length Using Pointer使用指针声明动态长度的字符串
【发布时间】:2022-11-14 18:57:41
【问题描述】:

我想声明一个字符类型的带指针的数组,数组的长度可以由我输入的字符串确定。

我是这样写的:

char *s;

cout << "Enter a string: " << endl;

cin >> s;

我希望我可以通过cin操作初始化字符串,但是编译时出现错误。该错误是关于“二进制表达式的无效操作数”。

我不知道为什么我写的行是错误的。 我虽然不仅内置 string 类用于声明数组。

C++中的string数据类型不是和“字符数组”一样吗?

char *s这行不是意味着指针s指向一个字符数组(或字符串)吗?

谢谢!

【问题讨论】:

  • 为什么不std::string s; std::cin &gt;&gt; s;
  • 指针不是数组。您不能将 100 个字符插入指针。为此使用 std::string 。
  • char* s;s 声明为指针,但它不会使 s 指向任何地方。如果你想让s指向你必须为此编写的代码,即s = ...
  • string 与字符数组不同。当然s也不是字符数组,它是一个指针,String,数组,指针,所有这些都是不同的。

标签: c++ arrays string char


【解决方案1】:

真正的问题是,您确实声明了一个指向字符的指针,但您没有指定为它分配多少。就好像你说你想创建一个盒子,但你没有指定大小。我告诉你正确的方法:

char *s = new char[10];

显然,在使用指针时,请始终记住在使用结束时释放它们,以免发生任何内存泄漏。

总结一下情况,您尝试将数据保存在您打算创建但不存在的框中。也就是说,您已将名为 s 的框命名为包含 pointer to a character 的框,但您尚未构建/创建它的最终大小。

【讨论】:

  • 在您的第二个示例中,char s[10]; s 是一个数组而不是指针,因此(例如)它不需要解除分配。我知道你知道,但不同之处在于提问者似乎对什么感到困惑。
  • 好的,那我就删了。我试图让他大致了解他遇到的问题。
  • 老实说,这是一个非常糟糕的主意。这个问题具体说“数组的长度可以由我的输入字符串确定”但是你把它硬编码为10。但是即使问题没有说,这只是要求缓冲区溢出。
  • 好吧,你可以看到现在是早上7点在我家...我没有看标题的疯狂...我不知道是我回答错还是他不想说是我的错使用标准的东西
【解决方案2】:

你应该使用std::string

#include <string>
#include <iostream>

std::string s;
std::cout << "Enter a string: " << endl;
std::cin >> s;

附注:最好避免using namespace std - 请参阅此处Why is "using namespace std;" considered bad practice?

【讨论】:

    【解决方案3】:

    “cin操作”。

    cin 是真正的来源。真正的工作是由重载的operator&gt;&gt; 完成的。读取到char*operator&gt;&gt; 期望char* 已经分配到正确的大小。这当然是cin 的问题,其大小未知。

    读取为std::stringoperator&gt;&gt; 重载会将std::string 的大小调整为正确的大小。

    【讨论】:

      猜你喜欢
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 2014-05-20
      • 1970-01-01
      • 2019-04-20
      相关资源
      最近更新 更多