C++ 在c+中查找字符数组的长度+;
我有一个字符数组的形式 字符x[]='asdasdasdas'C++ 在c+中查找字符数组的长度+;,c++,function,char,sizeof,C++,Function,Char,Sizeof,我有一个字符数组的形式 字符x[]='asdasdasdas' int p=sizeof(x)/sizeof(*x) 给出了正确的结果,但当我在另一个函数(如 空X(字符*a) int i=sizeof(a)/sizeof(*a) 我称之为 X(X) p和i不相等。怎么可能呢?当char数组被传递给接受char*的函数时,数组被称为对指针的“衰减”。此转换是自动的,并且编译器以前静态可用的长度信息丢失 可能的解决办法是: 将数组的大小作为附加参数传递 使char-数组以0结尾(即字符串文字),
int p=sizeof(x)/sizeof(*x) 给出了正确的结果,但当我在另一个函数(如 空X(字符*a) int i=sizeof(a)/sizeof(*a) 我称之为 X(X)
p和i不相等。怎么可能呢?当
char
数组被传递给接受char*
的函数时,数组被称为对指针的“衰减”。此转换是自动的,并且编译器以前静态可用的长度信息丢失
可能的解决办法是:
- 将数组的大小作为附加参数传递
- 使
-数组以0结尾(即字符串文字),并使用char
。这是C和C++中字符串操作的常用方法。然而,这引入了运行时成本,这并不是严格必要的。但是,它提供了一些便利(静态和动态大小的字符串使用相同的API)和错误恢复能力(长度总是正确的)strlen
- 使用模板捕获阵列的长度李>
a
是指针,*a
是字符。因此sizeof(a)
不会返回数组的大小,而是返回指向数组中第一个元素的指针的大小
为了找到字符串的长度(与“数组大小”不同),您有几个选项
第一,根本不要使用char*
,而是使用std::string
(可能会创建临时):
第二,扫描字符串以查找空终止符(线性复杂度):
第三,使用模板(不必要的复杂代码):
C风格的数组会出现它们自己的问题,最好完全避免。不要使用C型阵列,而要使用StdLib针对此问题设计的工具:
std::string x = "asdasdadsadasdas";
提供指针的大小。我的系统上有八个字节
char x[] = "fred";
sizeof(x);
返回5。以null结尾的字符串的大小
void x(char * c) {
sizeof (*c);
}
返回字符的大小
无论将数组的长度或原始类型传递给void x(),这都是正确的。请注意,sizeof()是在编译时计算的。在编译时,编译器通常无法知道传递的数组长度。如上所述,对于字符串长度的运行时评估,如果您确实希望字符串长度以字符为单位,请使用strlen。(或者是一个模板——但这可能是一个更不寻常的解决方案) 你是对的,但是数组还是以零结尾的,不是吗?使用整数数组时没有这样的问题。你真的确定可以编译吗?为什么数组是
char
?使用std::string
或std::vector
,您可能会更轻松,这取决于您实际尝试的操作。@Deduplicator是的,它可以完美地编译char x[]='asdasdas'
这应该是一个错误,使用多字符常量初始化长度未知的字符数组。您正在使用-Wall-Wextra-pedantic
并将所有警告视为错误?对多字符常量没有任何注释?@Deduplicator:抱歉?x的初始值设定项只有单引号,没有双引号。
template <size_t N> void X (const char (&arr)[N])
{
size_t i = N;
}
char x[]='asdasdadsadasdas';
std::string x = "asdasdadsadasdas";
sizeof(char *)
char x[] = "fred";
sizeof(x);
void x(char * c) {
sizeof (*c);
}