在c ++中查找字符数组的长度

时间:2014-12-24 14:40:02

标签: c++ function char sizeof

我有一个

形式的字符数组
  

char x [] ='asdasdadsadasdas';
  int p = sizeof(x)/ sizeof(* x)

给了我正确的结果,但当我把它作为参数传递给另一个函数,如

  

void X(char * a)

     
    

int i = sizeof(a)/ sizeof(* a)

  

我称之为

  

X(x)的

p和我不平等。怎么可能?

3 个答案:

答案 0 :(得分:2)

char数组传递给接受char*的函数时,该数组被称为“衰减”到指针。此转换是自动的,并且以前静态可用于编译器的长度信息将丢失。

可能的解决方案是:

  • 将数组的大小作为附加参数传递。
  • 使char - 数组0终止(即字符串文字)并使用strlen。这是在C和C ++中对字符串进行操作的常用方法。然而,这引入了运行时成本,这不是严格必需的。但是它提供了一些便利(对于静态和动态大小的字符串使用相同的API)和错误恢复(长度始终是正确的)。
  • 使用模板捕获数组的长度。 This is explained here.

答案 1 :(得分:1)

void X(char* a)

    int i = sizeof(a)/sizeof(*a)

此处,a是指针,*a是char。所以sizeof(a)不会返回数组的大小,而是指向数组中第一个元素的指针的大小。

为了找到字符串的长度(它与&#34;数组&#34的大小相同;),您有几个选项。< / p>

一个,根本不使用char*,但std::string(可能会创建一个临时的):

void X (const std::string& s)
{
  size_t i = s.length();
}

二,扫描字符串以寻找空终止符(线性复杂度):

void X (const char* p)
{
  size_t i = strlen (p);
}

三,使用模板(不必要的复杂代码):

template <size_t N> void X (const char (&arr)[N])
{
  size_t i = N;
}

以上每一项都有它自己的缺点。但如果您更广泛地了解您的计划并了解您可以在哪些方面进行改进,这一切都是最好的避免。这是一个突出我的人:

char x[]='asdasdadsadasdas';

C风格的数组提出了自己的问题,最好完全避免。不要使用C风格的数组,而是使用专为此问题设计的StdLib工具:

std::string x = "asdasdadsadasdas";

答案 2 :(得分:1)

sizeof(char *) 

给你指针的大小。我的系统上有八个字节。

char x[] = "fred"; 
sizeof(x);

返回5.具有空终止的字符串的大小。

void x(char * c) { 
sizeof (*c); 
} 

返回char的大小。

无论将数组的长度或原始类型传递给void x(),都是如此。请注意,sizeof()在编译时进行评估。在编译时,编译器通常无法知道它已经传递了多长的数组。对于字符串长度的运行时评估,如上所述,如果您确实希望字符串长度为字符,请使用strlen。 (或模板 - 但这可能是一个更不寻常的解决方案)。