【问题标题】:Is there a way in C++ to use a key word to determine array length?C++ 中有没有办法使用关键字来确定数组长度?
【发布时间】:2021-03-14 04:01:40
【问题描述】:

我正在尝试在 C++ 中创建一个函数,该函数将接受字符串输入并使用它来填充数组。数组将被填充的值是固定的,但这取决于传入的单词。一些元素保持不变,而一些元素发生变化。数组大小还取决于传入的字符串。我知道我可以通过制作两个更长的“if”语句来做到这一点,但这种方法似乎更有效……如果我能让它工作的话。下面的代码不起作用,但它只是为了让我大致了解我的顶空。任何帮助表示赞赏。谢谢!

myString = "long";
    
if (myString == "short") {
      int numArr* = new int[3];
      numArr[2] = 0x02;
      }
    
if (myString == "long") {
  int numArr* = new int[5];
  numArr[2] = 0x04;
  numArr[4] = 0xA1;
  numArr[5] = 0x32;
  }
  
numArr[0] = 0x00;
numArr[1] = 0xFF;
numArr[3] = 0x50;

cout << numArr;

delete[] numArr;

【问题讨论】:

  • 您使用的是哪个 C++ 版本?当myString"short" 时,无条件地填充numArr[3] 是越界访问new int[3]
  • 你不使用std::vector&lt;int&gt;的原因是什么?
  • “关键词”到底是什么意思?
  • 您的代码存在多个问题。但是你说not working 并没有定义你的意思。无论如何,您的问题是范围界定。您在一个范围内声明numArr,并尝试在该范围外声明cout。您需要将int nmArr* 放在myString = "long"; 之后

标签: c++ arrays


【解决方案1】:

首先,回答您的问题:给定一个指向 int 的指针(如您发布的代码中的 numArr),没有可移植的方法来查询它指向的数组的大小(甚至无法验证它实际上指向一个数组!)

如果你有一个合适的数组,像这样(不仅仅是一个指针),OTOH:

int properArray[6];

...这样的函数将返回数组中的项目数:

template<typename T, int size> constexpr unsigned int GetArraySize(T(&)[size]) 
{
   return size;
}

unsigned int arraySize = GetArraySize(properArray);  // sets arraySize to 6

也就是说,在我看来,让你的代码更简单、更高效的最好方法是在堆栈上分配一个固定大小的数组(大到足以处理最坏的情况)并跟踪有多少数组中的项实际上正在被使用,如下所示:

#include <string>
#include <iostream>

int main(int, char **)
{
   int numArr[6] = {0x00, 0xFF, 0x00, 0x50, 0x00, 0x00};
   int numValidArrayItems = 3;

   std::string myString = "long";
   if (myString == "short") {
     numArr[2] = 0x02;
   }
   else if (myString == "long") {
     numArr[2] = 0x04;
     numArr[4] = 0xA1;
     numArr[5] = 0x32;
     numValidArrayItems = 6;
   }

   for (int i=0; i<numValidArrayItems; i++) std::cout << numArr[i] << "\n";
   return 0;
}

这避免了 newdelete[] 调用,这可能是已发布代码中最昂贵(且容易出错)的部分,并且还避免了查询 numArr 指针以确定它指向的数组的大小。

【讨论】:

  • 模板中涉及的类型有些奇怪:模板参数类型是(有符号的)int int,函数的返回类型是unsigned int。两者都应该匹配,最好使用size_ttemplate&lt;typename T, size_t&gt; constexpr size_t GetArraySize...
  • 如果您有 C++17 或更高版本,则无需编写自己的 GetArraySize 包含:std::size(properArray)
【解决方案2】:
int r[10];
int count = sizeof(r)/sizeof(r[0]);
cout<<count;

我只看到了这种类型的解决方案,抱歉。您可以查看此线程并获得更好的见解(例如,如果您想使用函数)

上述话题的链接: Element count of an array in C++

【讨论】:

  • 不幸的是,这种技术不适用于使用new 创建的动态 数组。
  • 如果您在问题中注意到 numArry 被声明为指针 (int numArr*) 所以 sizeof numArr;sizeof (a_pointer); - 不是您想要的。 (如果与问题count == 1 中的指针一起使用,如果sizeof(int)sizeof(a_pointer) 相同或可能2 有一个4 字节int 和8 字节指针)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多