2011-11-08 114 views
5

我声明如下数组:如何在C中查找“char *”数组的长度?

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

我通过此数组的函数。我如何在函数中找到这个数组的长度?

+1

焦炭星级==字符指针 –

+2

顺便说一句,使用'I'代替'i'可能有助于避免“这是一个合理的问题”启发式(除了让英语母语人士更容易阅读这个问题)。 – sarnold

回答

17

将数组长度传递给函数后无需额外努力就无法找到数组的长度。你需要:

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

如果你想知道,大多数人感到遗憾的是C字符串以这种方式工作。

+0

因此他们发明了B字符串。 –

+0

@MooingDuck链接请:)谷歌是关于这个问题的妈妈 –

+0

Apperently的正确名称为[BSTR(http://msdn.microsoft.com/en-us/library/windows/desktop/ms221069(V = vs.85 )的.aspx)(讨厌的人比C字符串) –

6

当你通过一个数组有不是一个简单的方法来确定函数内的大小。

您可以传递数组大小作为一个参数 或 使用的std ::矢量<的std :: string>

如果你感觉特别冒险可以使用some advanced template techniques

简而言之,它看起来像

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

是的,这就是我目前正在做什么,但我想删除多余的paramater。哦,还有 – bubbles

+0

还有一个std :: array 类。 –

+3

@bubbles'int main(argc,char ** argv)'。如果它很简单,主要做法会有所不同。 –

0

如果你的意思是所有字符串添加到集合中的时间有多长。

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

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

补充:

是那目前在做什么IM,但我想删除多余的 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 *数组[] = { “一”, “二”,(字符*)0};

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

从指针获取数组大小是不可能的。你可以用NULL指针终止数组。这样你的函数可以搜索NULL指针来知道大小,或者干脆停止处理输入,一旦它达到NULL ...

2

C在你背后做了一些诡计。

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

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

这两个是相同的:

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

其结果是,不知道,内部foo()bar(),如果你 调用阵列,阵列的一部分,或一个指向单个 整数:

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

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

有些人喜欢写自己的功能,如:void foo(int *array) 只是提醒自己,他们并没有真正传递了阵列, 而是指向一个整数的指针,可能有或没有更多 附近的其他地方。有些人喜欢编写他们的功能 ,比如:,以便更好地提醒自己 函数期望传递给它。不管你喜欢这样做,如果你想知道你的 阵列多久哪种方式

,你有几种选择:

  1. 通行证沿长度paramenter了。 (Think 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)参数处理,但 它可能很容易是一个数组。)
+1

琐事:'argv'确实指向了1和2。 – u0b34a0f6ae