[讨论] 【C标准库里那些好玩的题目】strlen那个题目的清晰说明 + 偶滴一种实现

辛昕   2017-9-25 17:13 楼主
上一个贴,大家都反映没看懂。 我看了一下那个b数组,也是给它搞死。遂,出一个完整的题目和说明
引用: 一个char型数组,去掉里面所有的 0x00字节。 例如 原数组 0x32,0x01,0x00,0x32,0x33,0x00,0x00,0x32,0x64,0x02,0x00,0x32,0x00 期望得到的结果是 0x32,0x01,0x32,0x33,0x32,0x64,0x02,0x32
本帖最后由 辛昕 于 2017-9-27 11:43 编辑
强者为尊,弱者,死无葬身之地

回复评论 (14)

还有一点要说明,是在原数组上修改,还是得到另外一个新的数组?
点赞  2017-9-25 17:20
说实话,我非常喜欢教主出的一些小题目。。。
  1. #include <stdio.h>

  2. int filter(unsigned char* a, int len) {
  3.     unsigned char *p =a, *q = a, *e = a+len;
  4.     while(q != e && ((*q && (*p++ = *q++)) || q++));
  5.     return p-a;
  6. }

  7. int main(int argc, const char * argv[]) {
  8.     unsigned char a[] = {0x32,0x01,0x00,0x32,0x33,0x00,0x00,0x32,0x64,0x02,0x00,0x32,0x00};
  9.     int n = filter(a, sizeof(a));
  10.     for(int i=0; i<n; i++) {
  11.         printf("%2x ", a[i]);
  12.     }
  13.     return 0;
  14. }

点赞  2017-9-25 18:05
引用: lcofjp 发表于 2017-9-25 18:05
说实话,我非常喜欢教主出的一些小题目。。。
[code]#include

int filter(unsigned cha ...

队长牛逼
training
点赞  2017-9-25 21:05
引用: lcofjp 发表于 2017-9-25 18:05
说实话,我非常喜欢教主出的一些小题目。。。
[code]#include

int filter(unsigned cha ...

while里那条件很酷炫。虽然看20s没看懂.........
貌似这是最基本的一种方法

好,继续............

等待下一个答案
强者为尊,弱者,死无葬身之地
点赞  2017-9-26 10:28
引用: lcofjp 发表于 2017-9-25 18:05
说实话,我非常喜欢教主出的一些小题目。。。
[code]#include

int filter(unsigned cha ...

够骚~
HELLO_WATER
点赞  2017-9-26 11:29
我来捣个乱,哈哈,python
import numpy as np
a = np.array([0x32,0x01,0x00,0x32,0x33,0x00,0x00,0x32,0x64,0x02,0x00,0x32,0x00])
b = a[a!=0]
嘿嘿,淫荡吧
板载电源模块,小尺寸,多年应用,成熟稳定  www.HuntChance.com
点赞  2017-9-26 22:06
引用: 风过琴弦 发表于 2017-9-26 22:06
我来捣个乱,哈哈,python
import numpy as np
a = np.array([0x32,0x01,0x00,0x32,0x33,0x00,0x00,0x32, ...

看不懂的路过.............
强者为尊,弱者,死无葬身之地
点赞  2017-9-26 22:22
引用: 风过琴弦 发表于 2017-9-26 22:06
我来捣个乱,哈哈,python
import numpy as np
a = np.array([0x32,0x01,0x00,0x32,0x33,0x00,0x00,0x32, ...

life is short
点赞  2017-9-26 23:40
引用: 风过琴弦 发表于 2017-9-26 22:06
我来捣个乱,哈哈,python
import numpy as np
a = np.array([0x32,0x01,0x00,0x32,0x33,0x00,0x00,0x32, ...

你用numpy感觉有点杀鸡用牛刀了,用原生数组的过滤功能感觉更简单易懂,当然用numpy显得更高大上,不过用python本身就是坦克大炮了,直接用浏览器的控制台窗口这种小米+步枪的方式也是可以的:
淫荡.png
用惯了高级语言,再去用C语言真的想吐,高级语言代码至少一行顶10行C代码,而且不用考虑各种没有意义且容易出错的细节问题,能更快的解决实际问题,化代码为生产力。C和C++真正的噩梦是内存管理,只不过搞单片机很少接触这东西,所以没感觉到C语言真正的痛点
点赞  2017-9-27 01:55
引用: lcofjp 发表于 2017-9-27 01:55
你用numpy感觉有点杀鸡用牛刀了,用原生数组的过滤功能感觉更简单易懂,当然用numpy显得更高大上,不过用 ...

你这个我也看不懂。。。浏览器内置的,是js的解释器?
板载电源模块,小尺寸,多年应用,成熟稳定  www.HuntChance.com
点赞  2017-9-27 09:09
引用: 风过琴弦 发表于 2017-9-27 09:09
你这个我也看不懂。。。浏览器内置的,是js的解释器?

嗯,javascript控制台
点赞  2017-9-27 11:05
  1. #include <stdio.h>
  2. #include <string.h>

  3. // TODO:这个实现,对于出现连续几个0的情况无法解决
  4. void rid_zero_strlen_way(char *src,char *dest)
  5. {
  6.         char *p;
  7.         size_t len;
  8.        
  9.         p = src;

  10.        while(p != NULL)
  11.         {
  12.                 len = strlen(p);
  13.                   
  14.                                    printf("len:%ld\n",len);
  15.         
  16.                 if(len != 0)
  17.                 {
  18.                         memcpy(dest,p,len);
  19.                         dest += len;
  20.                         p += len + 1;
  21.                 }
  22.                 else
  23.                          break;
  24.         }
  25. }

  26. int main(void)
  27. {
  28.            char src[13] = {0x32,0x00,0x51,0x74,0x00,0x12,0x4a,0x00,0x1a,0x43,0x00,0x32};
  29.     char dest[32];   //32长度是随意的;
  30.         int i;

  31.         for(i = 0;i < 13;i++)
  32.                         printf("0x%02x\t\t",src[i]);
  33.                
  34.     rid_zero_strlen_way(src,dest);
  35.    
  36.         for(i = 0;i < strlen(dest);i++)
  37.                         printf("0x%02x\t\t",dest[i]);

  38. }
强者为尊,弱者,死无葬身之地
点赞  2017-9-27 11:41
引用: 辛昕 发表于 2017-9-27 11:41
[code]#include
#include

// TODO:这个实现,对于出现连续几个0的情况无法解决
void  ...

心服口服!
点赞  2017-9-27 12:23
引用: lcofjp 发表于 2017-9-27 12:23
心服口服!

服啥,这其实是个很弱鸡的东西
就是觉得好玩
强者为尊,弱者,死无葬身之地
点赞  2017-9-27 14:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复