2016-12-05 83 views
0

如何获取作为指针传递给函数的字符数组的实际最大大小?在函数中获取c风格字符串的大小(不是长度)

int size=0; 
while (char_array[size++]) 

这是行不通的,因为它会在数组中返回的字符数,我需要它的实际大小。

另外我不能使用任何库(特别是字符串)或我自己的类或基本上任何有用的东西。

编辑,因为它证明,我将不得不快速解释任务。我被告知不要在评论中这样做。所以这里是:

我必须实现一个函数,它有三个字符数组作为指针传递。无法以任何方式改变它。第一个是包含在该字符串中的命令的字符串(重要)。这些命令很简单:删除x个字母等等,但有些很棘手,比如从右边第二个/第三个字符数组中添加x个字母。为什么要棘手?因为这些数组可能包含更多的命令,这些命令将被添加到我正在处理的字符串中。 所以一种方法是对传递给函数的字符串进行处理,但这会非常慢,并且我必须在中间添加/删除字符,这意味着多次移动其余字母。所以我必须有m * n个操作,其中n是字符串的大小,m是命令的数量。但只有n个操作,如果我可以写入另一个字符串。 但是我不知道我需要多少空间,因为这些命令可能会添加更多的命令,这会增加更多字母给最初的字符数量。事先检查命令的数量和类型会很慢,并且使整个事情变得毫无意义。但是我知道传递给函数的字符串将有足够的空间(这是在分配规范中)。所以,如果我只是可以访问它的大小,我可以声明另一个相同大小的字符串,知道它确实适合resulf。

那么我该怎么办?我将声明这个本地字符串,我正在写入初始大小,然后如果结果更大,我会将其重写为更大的字符串。这会给我n次z操作,其中z是重写次数,它仍然比n次m好,但比n更糟。

+1

为什么不将数组大小传递给你的函数? – SergeyA

+0

因为我不被允许。我同意这种问题永远不会出现在严肃的编程中,而且如果一个人允许有一点灵活性,那么这个问题就很轻松,但我不是。 – user3019593

+1

'std :: string'类跟踪它的长度和容量;所以使用'std :: string'而不是字符数组。 –

回答

3

如果你可以改变函数签名,你可以使用一些模板魔术:

template<int N> 
int foo(char (&arr)[N]) 
{ 
    int size = N; 
} 

这里假设你实际上传递一个数组,而不是一个普通的指针。

如果你正在传递指针,则还需要在大小通过,或使用非标准黑客(如实际的数组,其中该尺寸通常存储之前检查所述存储器)

+0

我不能这样做。所以基本上,我不能以标准的方式做我想要的东西(当我的任务被评估时,这不会被拒绝)? – user3019593

+1

@ user3019593那么我不清楚需求是什么...... –

+1

“非标准黑客攻击”只有在数组已经直接在堆上分配了'new char [47]'或'malloc'的情况下才会起作用。如果数组是堆栈中的局部变量,或者它是静态变量或全局变量(或者它是堆中更大结构的成员变量),则没有大小信息。 –

相关问题