搜索
bottom↓
回复: 32

取数组长度 的问题

[复制链接]

出0入0汤圆

发表于 2011-1-19 11:12:52 | 显示全部楼层 |阅读模式
取数组长度函数函数

INT8U mystrlen(INT8U *str)//取字符串长度
{
    int i;
    for( i = 0; str != '\0'; i ++ )
        ;                           
    return i;
}
为什么有时候 碰到0 就会结束
有时候 碰到0 也不会结束呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2011-1-19 11:38:12 | 显示全部楼层
我的数组里,有0,
我应该用什么办法,取他的长度呢?

出0入0汤圆

 楼主| 发表于 2011-1-19 12:26:35 | 显示全部楼层
比如
unsigned char str[20] = {0x30,0x31,0x32,0x00,0x33};

出0入0汤圆

发表于 2011-1-19 13:13:00 | 显示全部楼层
len=sizeof(str)/sizeof(str[0]);

出0入0汤圆

 楼主| 发表于 2011-1-19 13:26:52 | 显示全部楼层
嗯 这个可以的
谢谢

出0入0汤圆

发表于 2011-1-19 13:34:40 | 显示全部楼层
其实我不知道你究竟是要取数组长度还是字符串的长度……如果是字符串长度我的结果是不正确的,你那个应该是正确的

出0入0汤圆

 楼主| 发表于 2011-1-19 13:35:44 | 显示全部楼层
我的数组里 有字符 有16进制数

出0入0汤圆

 楼主| 发表于 2011-1-19 13:51:31 | 显示全部楼层
刚才的那个办法 好像还是有问题
len=sizeof(str)/sizeof(str[0]);
不管str里面有多少数据 他都会得5

出0入0汤圆

 楼主| 发表于 2011-1-19 14:02:44 | 显示全部楼层
不对哦
是20
sizeof(str) = 20
sizeof(str[0]) = 1
所以 最后的结果是20
得不到正常的数据个数

出0入0汤圆

 楼主| 发表于 2011-1-20 09:27:54 | 显示全部楼层
我写了一个简单的函数
INT8U mybuflen(INT8U *str,INT8U n)
{
   int i;
   for(i=n-1;i>=0;i--)
    {
      if(str != '\0')
        return (i+1);
    }
}
mybuflen(str,20);
这样能取它的长度
就是罗嗦一点
不知道有没有更好的办法

出0入0汤圆

发表于 2011-1-20 10:07:11 | 显示全部楼层
楼主你的意思是不是要取数组中不为空的数据个数?

出0入42汤圆

发表于 2011-1-20 10:09:26 | 显示全部楼层
描述得不怎么清楚,到底要计算什么?
{0x31, 0x31, 0x00, 0x33, 0x34}
如果是要2这个数,没有问题
如果要得到5,那是有问题的---而且不可能的,处理的时候,直接把收到数据的长度传过去就好,别再计算一次了

因为0x34以后,数组元素还是存在的,而且随机或者上次你填充的数据.

出0入0汤圆

 楼主| 发表于 2011-1-20 10:29:12 | 显示全部楼层
回10楼:
我是想要,数组中的真正的个数,
比如char str = {0x31, 0x31, 0x00, 0x33, 0x34};
我要取它的长度 5

出0入0汤圆

 楼主| 发表于 2011-1-20 10:34:11 | 显示全部楼层
回11楼:
按照9楼写的函数
可以得到数组中的数据长度
因为数据不全是串口过来的
要是定义的时候 把长度定义的正好
后面要是需要改动
会很麻烦
所以 最好测长度
这样数组连接或其他处理
都方便

出0入42汤圆

发表于 2011-1-20 10:44:47 | 显示全部楼层
你的测试代码不出问题那是因为你使用了全局变量,并且只调用了一次这个函数.

这么测试吧,先赋值为0x30, 0x31, 0x32, 0x33, 0x34, 0x00, 0x35(这个结束符到底有没?)
这时候你应该能得到一个长度7

现在再次赋值为0x31, 0x32
你看看这时候你能得到2不?

除非你每次写入前把数组整个清零...

还有,你有研究过你的数据0x00会出现在最后一个不?如果可能,整个清0也没用啊

出0入0汤圆

发表于 2011-1-20 10:51:05 | 显示全部楼层
使用指针没有结束标志不能测长度。使用数组构造后大小固定了。可以使用动态数组或增加一个长度变量。

出0入0汤圆

发表于 2011-1-20 10:54:42 | 显示全部楼层
1.数组当作函数参数时已经相当于指针了,所以你不能用sizeof(str)/sizeof(str[0])这种方式来技术函数参数数组的大小
2.如果你传入的不是一个字符串,你必须把数组的大小也作为参数传入进来,否则你没有办法计算出数组的大小
3.如果你传入的是一个字符串,可以按照for( i = 0; str != '\0'; i ++ );这种方法来计算数组的大小。不过这个准确的说计算出来的是字符串的长度

出0入0汤圆

 楼主| 发表于 2011-1-20 12:52:43 | 显示全部楼层
回14楼:
你考虑的很全面
我也是处理完数组之后
整个数组清零的
还有就是你说的那种
最后是0X00
那 这种方式不能用

出0入0汤圆

 楼主| 发表于 2011-1-20 13:07:40 | 显示全部楼层
回15楼:
INT8U mybuflen(INT8U *str,INT8U n)
{
   int i;
   for(i=n-1;i>=0;i--)
    {
      if(str != '\0')
        return (i+1);
    }
}
可以测字符串和数组的长度
除了 走后一个数据是0x00意外
还有 我用的时候 是另外定义一个变量
INT8U str[20] = {0x30,0x31,0x32,0x00,0x33};
INT8U len;
len = mybuflen(str,20);
len是数组str的非零数据的长度

出0入0汤圆

 楼主| 发表于 2011-1-20 13:14:18 | 显示全部楼层
回16楼:
如果字符串中有0
比如INT8U str = "1230123";
for( i = 0; str != '\0'; i ++ );
用这个语句
只能得到3
碰到0就截断了
也就是说 字符串 "1230123" == "123";
还有一个问题 我很奇怪
我在网上看到很多人用
sizeof(str)/sizeof(str[0])
这样根本就不对
不知道 怎么调试的

出0入0汤圆

发表于 2011-1-20 13:28:08 | 显示全部楼层
回复【19楼】kekele  
-----------------------------------------------------------------------

搞错了吧0x00就是'\0'不是'0'看清楚了。
sizeof(str)/sizeof(str[0])是取数组的长度,不用管数组是什么类型的。你遇到wchar就知道为什么了。

出0入0汤圆

发表于 2011-1-20 13:30:23 | 显示全部楼层
回复【19楼】kekele  
回16楼:
如果字符串中有0
比如int8u str = "1230123";
for( i = 0; str != '\0'; i ++ );
用这个语句
只能得到3
碰到0就截断了

=========================================
这个你测试了吗?这里比较的是ascii值,字符'0'的ascii值是0x30,'\0'它的ascii值是0.



也就是说 字符串 "1230123" == "123";
还有一个问题 我很奇怪
我在网上看到很多人用
sizeof(str)/sizeof(str[0])
这样根本就不对
不知道 怎么调试的
========================
这样计算数组大小是可以的,前提是str就是数组,而不是作为函数参数传入的数组(这时的数组已经蜕变为指针了)。不知明白了没?

出0入0汤圆

发表于 2011-1-20 13:31:32 | 显示全部楼层
如果你定义的INT8U str = "1230123";是INT8U str = "123\0123";的话你看看调试窗str是什么……汗INT8U str = "1230123";没有*也没有[]这个神了……

出0入0汤圆

发表于 2011-1-20 13:43:03 | 显示全部楼层
假设十六进制数从0x00~0xff都有可能存入数组里,而且0x00(‘\0')位置出现时随机的。
那么要求数组的长度,可以整一个变量记录,存入一个后+1,取出一个-1。

出0入0汤圆

发表于 2011-1-20 13:53:47 | 显示全部楼层
回复【22楼】hemjidn  捱多年
如果你定义的int8u str = "1230123";是int8u str = "123\0123";的话你看看调试窗str是什么……汗int8u str = "1230123";没有*也没有[]这个神了……
-----------------------------------------------------------------------

lz的例子估计压根就没测试,在考大家呢!

出0入0汤圆

 楼主| 发表于 2011-1-20 13:55:32 | 显示全部楼层
刚刚弄错了
INT8U str[20] = "1230123";
for( i = 0; str != '\0'; i ++ );
用这个可以得到长度
0x00 和字符的'0'是不一样的
还有 INT8U str = "123\0123";
调试串口会出错
我的编译器是 IAR

出0入0汤圆

 楼主| 发表于 2011-1-20 13:58:58 | 显示全部楼层
嘿嘿
因为我编译的我上网的不是一台机器
所以....
是 INT8U str[20] = "1230123"; 哦

出0入0汤圆

发表于 2011-1-20 14:11:20 | 显示全部楼层
INT8U str = "123\0123";
这样定义你想干什么?不是折腾吗?

出0入42汤圆

发表于 2011-1-20 14:14:52 | 显示全部楼层
数据不管从哪来,一定有长度,不管你收过来的还是自己赋值的,还是拷贝内存的.这里不要用字符串这个词了,这不是字符串是数据块.
从得到数据的时候就记录长度,然后使用的时候,老老实实地dataHandle(char* data, U8 len)这样子处理.实际上很多通信数据都这么处理的.

出0入0汤圆

发表于 2011-1-20 14:20:18 | 显示全部楼层
27楼我删了唉……
【26楼】 kekele
我相信你把数据0x00和字符0搞混了……才会由Lz位的问题出现如果是把字符串和数据混合就请把数据格式化一下先吧。

出0入0汤圆

 楼主| 发表于 2011-1-20 14:31:53 | 显示全部楼层
嗯 现在明白了
非常感谢大家的帮助
还有 我现在处理的数组里面
有字符串 有16进制数
还需要连接和发送
所以才遇到这个问题
嘿嘿
现在发现 C 基础太差了

出0入0汤圆

发表于 2011-1-20 15:11:23 | 显示全部楼层
转义一下就可以了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 23:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表