【问题标题】:Array Manipulation in C++C++ 中的数组操作
【发布时间】:2009-10-10 20:22:41
【问题描述】:

帮我理解这段代码 -

第一次迭代后,PlcCode 的值变为 A1*。怎么会?不应该是A*吗?

   Code = "A1";
   char Wild = '*';
   TDataString PlcCode(Code);

   for (int i = (Code.Len() - 1); i >= 0; i--)
   {          
      PlcCode[i] = Wild;
   }

【问题讨论】:

  • Code是什么类,Len()方法有什么作用?
  • 真的,提供更多上下文。 TDataString, Len, Code... 这段代码中唯一知道的就是 char。
  • 我没有在其中看到一个 C++ 数组——只有一个碰巧实现 operator[] 的未知类。我的猜测 - 那门课坏了。
  • @Steve314 它包含"A1",这是一个 C++ 中 3 个字符的数组。

标签: c++ arrays


【解决方案1】:

另一种可能性

  • TDataString 存储非空终止数据,并有一个模板化的 operator= 接受字节数组。

这样,您可以将代码视为

   TDataString Code(3);
   Code[0] = 'A';
   Code[1] = '1';
   Code[2] = '\0';

   char Wild = '*';
   TDataString PlcCode(Code);

   for (int i = 2; i >= 0; i--)
   {              
      PlcCode[i] = Wild;
   }

想象一下TDataString的以下实现

struct TDataString {
  typedef unsigned char TElement;

public:
  TDataString(std::size_t n):data(n) { }

  template<typename T, std::size_t N>
  TDataString(T const (&d)[N]):data(d, d+N) { }

  TElement &operator[](std::size_t i) {
    return data[i];
  }

  std::size_t Len() const { return data.size(); }

private:
  std::vector<TElement> data;
};

使用该类,我们可以将"A1" 分配给Code,它会赋予它3 的长度,然后执行循环的第一次迭代将使我们得到A1*。

【讨论】:

  • 这只有在代码的长度包括空终止符时才有意义,这至少可以说是不寻常的。注意 - Code 的长度是两个,覆盖的第一个下标是 (Code.Len () - 1) 我希望是一个。
  • @Steve314,我所说的“存储非空终止数据”的意思是数据不一定是空终止的(通常是“正常”字符串的情况)。也就是说,您可以完成 Code[2] = 'B'; 并且长度仍然是 3。否则,我认为简单地命名类 TString 会是更好的选择
【解决方案2】:

我看到两种可能的情况:

  • TDataString 正在重载 operator[ ] 并使用索引 1 作为开始(很可能模拟另一种语言)。
  • Code.Len() 不会为您提供可预测的输出。

当然,这些都是推测,因为我没有任何其他信息。

【讨论】:

  • 如果它使用以 1 为底的下标,结果将是 "*1" - 下标 2 永远不会被循环覆盖(假设 Len 返回 2)。
  • 如果 TDataString 重载 [] 来模拟数组,那么据我从代码中了解,它从 0 而不是 1 开始。我同意你的整体猜测:)
  • 对不起 - 那应该是“*”(可能后面是垃圾)。
  • 据我们所知可以是两者的结合。
猜你喜欢
  • 2021-07-02
  • 2021-03-16
  • 2020-09-04
  • 2011-01-31
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
相关资源
最近更新 更多