有一组字符串"Hello World",欲通过51串口发送。
假设定义字符串 char a[]="Hello World";
咱天下第一老所长写的发送循环入口条件是:
for( i=0; i<sizeof(a); i++ )
有问题吗?
俺告诉他:这是字符串,自己有指针和边界'\0';不是数组概念。无需求长度sizeof(a)。
所以循环条件应为:
for ( ; *a!='\0'; )
两者结果一样吗?——不一样!差了一个字符串结尾字节0x00!
如若2种写法最终效果一样,也就没什么可较真的了。可惜老所长发送的是'Hello World\0'多发送了一字节'\0'! 还要作为“完美”范本推荐给大家。
老所长振振有词:“只要传入一个buffer, 一定要同时规定size, 这是菜鸟与高手的区别之一。”(把字符串当做数组一样处理大概就是高手的境界了。)
别人谈的是C语言字符串类型,他却在这牛头不对马嘴地讲起了数组概念,就像以往C混不过去,就来C++,C++再混不过去,他给你来C#,他总是有理。 顾左右而言它,——这大概也是强词夺理的手法之一?
提醒一句:如若 a字符串是一个协议帧,您老大人多发送了一个字节,就意味着接收方接收到的是错误信息帧,CRC帧校验通不过而被废弃掉。 如若a字符串是一个密码组,多输入一位.... 如若a字符串是一条命令,....航天器就掉下来啦。
C语言字符串基础 (——摘自任何C语言教材) 字符串是一种重要的数据类型。......字符串就是一串零个或多个字符,并且以一个位模式为全0的NUL字节结尾。因此,字符串所包含的字符内部不能出现NUL字节。这个限制很少会引起问题,因为NUL字节并不存在与它关联的可打印字符,这也是它被选为终止符的原因。NUL字节是字符串的终止符,但它本身并不是字符串的一部分,所以字符串的长度并不包括NUL字节。
强调一下最后一句:“NUL字节是字符串的终止符,但它本身并不是字符串的一部分,所以字符串的长度并不包括NUL字节。” 哈哈,老爷子把字符串当作一般数组一样求sizeof(a),结果把字符串终止符NUL也算了进去,比实际字符串长度多算了一字节! 还因此极力向菜鸟推荐:今后凡遇到发送字符串均视为数组发送一样处理,均以我“天下第一”的通用发送程序为标准。
什么?多发送了一字节'\0'? 咳,那正是俺天下第一的创新发明,其中深奥说了你们也不懂,无可奉告。那是为了避免攻击。
结论:1、求一个字符串(数组)的长度,应该用strlen( ),而不是sizeof( )。——字符串不是数组。 2、如若修炼了几十年还搞不清楚这类问题,请尽可能使用丰富的C处理字符串和字符的库函数。这对C++,C#,JAVA...都是一样的。
(高手说:“我写C程序从来不用库函数。...”结果就是,错误程序放在那里N天,自己还不知道。还在“以完美的心情欣赏它。”) 特别是,还暴跳如雷地训导学生“菜鸟”。这恐怕就是高手和菜鸟的根本区别了。
下面验证程序:
#include<stdio.h> #include<string.h>
code char a[]="Hello World";
void main() { char cc,ss;
cc=sizeof(a); ss=strlen(a);
printf(" %bd %bd",cc,ss);
while(1); }
打印结果:12 11 关于这个程序验证的结论,不知道天下第一高手,老所长还有什么牛头不对马嘴的“总是有理”的理由可以向大家辩解的。
别在这谈数组。这讨论的是字符串类型。
|