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

6
我声明了以下数组:
char* array [2] = { "One", "Two"};

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

1
字符星等于字符指针。 - Joe McGrath
2
顺便提一下,使用 I 而不是 i 可能会避免“这是一个合理的问题吗”启发式算法(除了使问题更容易被英语母语人士阅读)。 - sarnold
6个回答

17
你不能在把数组传递给函数后轻松找到它的长度。你需要:
  1. 使用一个存储大小的容器,例如 vector (推荐)。
  2. 将其大小一起传递。这可能需要对您现有代码进行最少的修改并且是最快的修复方法。
  3. 使用类似于 C 字符串的哨兵值1。这使得查找数组长度成为线性时间操作,如果您忘记哨兵值,您的程序很可能会崩溃。对大多数情况来说,这是最糟糕的方式。
  4. 使用模板,在传递它时减去数组的大小。可以在此处阅读有关此模板的详细信息:How does this Array Size Template Work?

1 以防您想知道,大多数人都对 C 字符串的工作方式感到遗憾。


因此,他们发明了B字符串。 - Mooing Duck
@MooingDuck 麻煩給個連結 :) Google 上沒有相關資訊。 - Seth Carnegie
显然,正确的名称是BSTR(人们比C字符串更讨厌它们)。 - Mooing Duck

7
当您传递一个数组时,在函数内部没有一种简单的方法可以确定其大小。
您可以通过将数组大小作为参数传递,或者使用std::vector。
如果您感到特别冒险,可以使用一些高级模板技术
简而言之,它看起来像是这样的。
template <typename T, size_t N>
void YourFunction( T (&array)[N] )
{
    size_t myarraysize = N;
}

是的,这就是我目前正在做的,但我想要移除那个额外的参数。哎,算了。 - bubbles
还有一个std :: array<class Ty,std :: size_t N>类。 - jmmartinez
3
如果这真的很简单,那么主函数就会有所不同了。@bubbles int main(argc,char**argv) - Joe McGrath

2
C语言正在你背后做一些巧妙的操作。
void foo(int array[]) {
    /* ... */
}

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

这两者是相同的:

6.3.2.1.3: 除非它是sizeof运算符或一元&运算符的操作数,或者是用于初始化数组的字符串文字,否则具有类型“type的数组”的表达式将被转换为具有类型“指向类型”的表达式,该表达式指向数组对象的初始元素而不是一个lvalue。如果数组对象具有寄存器存储类,则行为未定义。

因此,在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)参数处理,但也可以是数组。)

0

如果你的意思是所有字符串加在一起有多长。

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* array [] = { "One", "Two", (char*)0 };

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

0

从指针获取数组大小是不可能的。您可以使用NULL指针终止数组。这样,您的函数就可以搜索NULL指针以了解大小,或者一旦遇到NULL就停止处理输入...


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接