[英]C Program to calculate the length of the string using functions and character array
[英]Calculate Length of Array in C by Using Function
我想制作一个计算传递数组大小的FUNCTION。
我将传递一个数组作为输入,它应该返回它的长度。 我想要一个功能
int ArraySize(int * Array /* Or int Array[] */)
{
/* Calculate Length of Array and Return it */
}
void main()
{
int MyArray[8]={1,2,3,0,5};
int length;
length=ArraySize(MyArray);
printf("Size of Array: %d",length);
}
长度应该是5,因为它包含5个元素,虽然它的大小是8(即使8会做,但5会很好)
我试过这个:
int ArraySize(int * Array)
{
return (sizeof(Array)/sizeof(int));
}
这将无效,因为“ sizeof(Array)
”将重新调整Int指针的大小。 只有当你具有相同的功能时,这个“ sizeof
”的东西才有效。
实际上我从C#开始很多天后回到C所以我不记得了(并且缺少Array.Length()
)
问候!
当你拥有的只是一个指针时,你无法计算数组的大小。
使这个“类似函数”的唯一方法是定义一个宏:
#define ARRAY_SIZE( array ) ( sizeof( array ) / sizeof( array[0] ) )
当然,这包含了所有常见的宏注意事项。
编辑:(以下评论真的属于答案...)
一旦您意识到sizeof()
是编译 sizeof()
算符 ,就可以理解在被调用函数中确定数组大小的不可能性。 它可能看起来像运行时函数调用,但它不是: 编译器确定操作数的大小,并将它们作为常量插入。
在声明数组的范围内,编译器具有实际上是数组的信息,以及它具有多少元素。
在传递数组的函数中,所有编译器都看到了一个指针。 (考虑到可能使用许多不同的数组调用该函数,并记住sizeof()
是一个编译 sizeof()
算符 。
您可以切换到C ++并使用<vector>
。 你可以定义一个struct vector
加上处理它的函数,但它并不是很舒服:
#include <stdlib.h>
typedef struct
{
int * _data;
size_t _size;
} int_vector;
int_vector * create_int_vector( size_t size )
{
int_vector * _vec = malloc( sizeof( int_vector ) );
if ( _vec != NULL )
{
_vec._size = size;
_vec._data = (int *)malloc( size * sizeof( int ) );
}
return _vec;
}
void destroy_int_vector( int_vector * _vec )
{
free( _vec->_data );
free( _vec );
}
int main()
{
int_vector * myVector = create_int_vector( 8 );
if ( myVector != NULL && myVector->_data != NULL )
{
myVector->_data[0] = ...;
destroy_int_vector( myVector );
}
else if ( myVector != NULL )
{
free( myVector );
}
return 0;
}
底线:C阵列有限。 您无法在子功能期间计算其长度。 您必须围绕该限制编写代码,或使用其他语言(如C ++)。
一旦数组衰减到指针,就不能这样做 - 你总是得到指针大小。
你需要做的是:
#define arrSz(a) (sizeof(a)/sizeof(*a))
。 Array.length()
。 你要求的东西根本无法做到。
在运行时,程序可用于数组的唯一信息是其第一个元素的地址。 甚至元素的大小也只能从使用数组的类型上下文中推断出来。
int getArraySize(void *x)
{
char *p = (char *)x;
char i = 0;
char dynamic_char = 0xfd;
char static_char = 0xcc;
while(1)
{
if(p[i]==dynamic_char || p[i]==static_char)
break;
i++;
}
return i;
}
int _tmain(int argc, _TCHAR* argv[])
{
void *ptr = NULL;
int array[]={1,2,3,4,5,6,7,8,9,0};
char *str;
int totalBytes;
ptr = (char *)malloc(sizeof(int)*3);
str = (char *)malloc(10);
totalBytes = getArraySize(ptr);
printf("ptr = total bytes = %d and allocated count = %d\n",totalBytes,(totalBytes/sizeof(int)));
totalBytes = getArraySize(array);
printf("array = total bytes = %d and allocated count = %d\n",totalBytes,(totalBytes/sizeof(int)));
totalBytes = getArraySize(str);
printf("str = total bytes = %d and allocated count = %d\n",totalBytes,(totalBytes/sizeof(char)));
return 0;
}
在C中你不能因为数组在传递给函数时衰减成指针(第一个元素)。
但是在C ++中,您可以使用Template Argument Deduction来实现相同的功能。
您需要传递长度作为附加参数(如strncpy
)或零终止数组(如strcpy
)。
存在这些技术的小变化,例如将指针与其自己的类中的长度捆绑在一起,或者使用不同的标记来表示数组的长度,但这些基本上是您唯一的选择。
已经很晚了。 但是我找到了解决这个问题的方法。 我知道这不是正确的解决方案,但如果你不想遍历整个数组的整数,它可以工作。
检查'\\ 0'在这里不起作用
首先,在初始化时将任何字符放在数组中
for(i=0;i<1000;i++)
array[i]='x';
然后在传递值后检查'x'
i=0;
while(array[i]!='x')
{
i++;
return i;
}
让我知道它是否有用。
不可能。 你需要从函数传递数组的大小,你从中调用这个函数。 当您将数组传递给函数时,只传递起始地址而不是整个大小,当您计算数组的大小时,编译器不知道多少大小/内存,此指针已由编译器分配。 因此,最后调用是,您需要在调用该函数时传递数组大小。
C中arry的大小是:
int a[]={10,2,22,31,1,2,44,21,5,8};
printf("Size : %d",sizeof(a)/sizeof(int));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.