如何在C中找到“char *”数组的长度?

时间:2011-11-08 01:57:11

标签: c++ c

我声明了以下数组:

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

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

6 个答案:

答案 0 :(得分:17)

在将数组传递给函数后无法轻松找到数组的长度。你需要:

  1. 使用存储尺寸的容器,例如vector推荐)。
  2. 传递尺寸。这可能需要对现有代码进行最少的修改,并且是最快的修复方法。
  3. 使用sentinel值,例如C strings do 1 。这使得查找数组的长度成为线性时间操作,如果忘记了哨兵值,程序可能会崩溃。在大多数情况下,这是最糟糕的做法。
  4. 使用模板在传递数据时扣除数组的大小。您可以在此处阅读:How does this Array Size Template Work?
  5. 1 如果您想知道,大多数人都对C字符串以这种方式工作的事实感到遗憾。

答案 1 :(得分:7)

传递数组时, NOT 是一种确定函数大小的简便方法。

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

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

简而言之,它看起来像

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

答案 2 :(得分:2)

C正在背后做一些诡计。

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

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

这两者都是相同的:

  

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

因此,如果您是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)参数处理,但是 它可以很容易成为一个数组。)

答案 3 :(得分:0)

如果你的意思是加入所有字符串多长时间。

int n=2;
int size=0;
char* array [n] = { "One", "Two"};

for (int i=0;i<n;++i)
  size += strlen(array[i];

<强>加了:

  

是的,这就是我目前在做什么,但我想删除那个额外的   paramater。哦,好吧 -

可能会对此做出错误的响应,但是你总是可以使用第一个指针来存储大小,只要你不尊重它或将它误认为实际上是指针。

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

long size=(long)array[0];
for(int i=1; i<= size;++i)
  printf("%s",array[i]);

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

char * array [] = {“One”,“Two”,(char *)0};

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

答案 4 :(得分:0)

无法从指针获取数组大小。您可以使用NULL指针终止数组。这样你的函数可以搜索NULL指针来知道大小,或者只是在它命中NULL时停止处理输入......

答案 5 :(得分:0)

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