【问题标题】:How do I find the length of "char *" array in C?如何在 C 中找到“char *”数组的长度?
【发布时间】:2011-11-08 01:57:11
【问题描述】:

我声明以下数组:

char* array [2] = { "One", "Two"};

我将这个数组传递给一个函数。如何在函数中找到这个数组的长度?

【问题讨论】:

  • char star == 字符指针
  • 顺便说一句,使用I 而不是i 可能有助于避免“这是一个合理的问题”启发式(除了让以英语为母语的人更容易阅读问题之外)。跨度>

标签: c++ c


【解决方案1】:

在将数组传递给函数后,如果不付出额外的努力,就无法找到数组的长度。您需要:

  1. 使用存储尺寸的容器,例如vector(推荐)。
  2. 同时传递大小。这可能需要对现有代码进行最少的修改,并且是最快的修复。
  3. 使用标记值,如 C 字符串 1。这使得查找数组的长度成为线性时间操作,如果您忘记了标记值,您的程序可能会崩溃。在大多数情况下,这是最糟糕的做法。
  4. 在传递数组时使用模板来扣除数组的大小。你可以在这里阅读:How does this Array Size Template Work?

1 如果您想知道,大多数人都会对 C 字符串以这种方式工作这一事实感到遗憾。

【讨论】:

  • 因此他们发明了 B 弦。
  • @MooingDuck 链接请 :) Google 在这个问题上是妈妈
  • 显然正确的名字是BSTR(人们比C字符串更讨厌这些)
【解决方案2】:

当您传递一个数组时,不是一种简单的方法来确定函数内的大小。

您可以将数组大小作为参数传递 要么 使用 std::vector<:string>

如果您觉得特别喜欢冒险,可以使用some advanced template techniques

简而言之,它看起来像

template <typename T, size_t N>
void YourFunction( T (&array)[N] )
{
    size_t myarraysize = N;
}

【讨论】:

  • 是的,这就是我目前正在做的事情,但我想删除那个额外的参数。哦,好吧
  • 还有一个std::array类。
  • @bubbles int main(argc,char**argv)。如果它是简单的 main 会以不同的方式完成。
【解决方案3】:

C 在你背后耍花招。

void foo(int array[]) {
    /* ... */
}

void bar(int *array) {
    /* ... */
}

这两个是相同的:

6.3.2.1.3:除非是sizeof运算符或一元&运算符的操作数, 或者是用于初始化数组的字符串文字,具有类型的表达式 ''array of type'' 被转换为类型为''pointer to type'' 的表达式 指向数组对象的初始元素并且不是左值。如果 数组对象有寄存器存储类,行为未定义。

结果,你不知道,在foo() 或bar() 内部,如果你是 使用数组、数组的部分或指向单个数组的指针调用 整数:

int a[10];
int b[10];
int c;

foo(a);
foo(&b[1]);
foo(&c);

有些人喜欢把他们的函数写成:void foo(int *array) 只是为了提醒自己他们并没有真正传递一个数组, 而是指向整数的指针,可能有也可能没有 附近其他地方的整数。有些人喜欢写他们的函数 喜欢:void foo(int array[]),以便更好地提醒自己 函数期望被传递给它。

不管你喜欢哪种方式,如果你想知道多久 你的数组是,你有几个选择:

  1. 也传递一个长度参数。 (想想int main(int argc, char *argv))。
  2. 设计您的数组,使每个元素都不是NULL,除了最后一个 元素。 (想想char *s="almost a string"; 或execve(2)。)
  3. 设计您的函数,使其采用其他一些描述符 论据。 (想想printf("%s%i", "hello", 10);——字符串描述 其他论点。 printf(3) 使用 stdarg(3) 参数处理,但是 它也可以很容易地成为一个数组。)

【讨论】:

    【解决方案4】:

    无法从指针获取数组大小。您可以使用 NULL 指针终止数组。这样,您的函数可以搜索 NULL 指针以了解大小,或者只是在遇到 NULL 时停止处理输入...

    【讨论】:

      【解决方案5】:

      如果您的意思是所有字符串加在一起的时间。

      int n=2;
      int size=0;
      char* array [n] = { "One", "Two"};
      
      for (int i=0;i<n;++i)
        size += strlen(array[i];
      

      添加:

      是的,这就是我目前正在做的,但我想删除额外的 参数。哦,好吧——

      对此可能会得到不好的响应,但您始终可以使用第一个指针来存储大小,只要您不尊重它或误认为它实际上是一个指针。

      char* array [] = { (char*)2,"One", "Two"};
      
      long size=(long)array[0];
      for(int i=1; i<= size;++i)
        printf("%s",array[i]);
      

      或者你可以 NULL 终止你的数组

      char* 数组 [] = { "一", "二", (char*)0 };

      for(int i=0;array[i]!=0;++i)
      {
        printf("%s",array[i]);
      }
      

      【讨论】:

        【解决方案6】:

        使用新的 C++11 std::array
        http://www.cplusplus.com/reference/stl/array/
        标准数组具有您正在寻找的大小方法

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-06
          • 2014-01-28
          • 2010-12-25
          • 2011-05-05
          相关资源
          最近更新 更多