原创 C语言中,利用宏定义一个字符串和字符数组定义的字符串其末尾都会自动添加\0字符

2013-4-7 00:55 7908 29 34 分类: 消费电子

 

C语言中,
利用宏定义一个字符串#define MYPHONE "AT+CMGS"
 
 
字符数组的方式来定义一个字符串unsigned char SMS[]="HELLO, WELCOME TO RCCTS!";
 
问题:这两种字符串定义方式下,在最后末尾都会自动添加字符'\0'吗?
 
以下是验证程序
#include <stdio.h>

#define MYPHONE "AT+CMGS"
unsigned char SMS[]="HELLO, WELCOME TO RCCTS!";

unsigned char *String;
unsigned char i=0;

void main()
{
     printf("**************this procedure is to confirm \\0 's exist****************\n");
/********************************验证MYPHONE字符串末尾是否有\0字符*************************/
     String=MYPHONE;
     while(*String)               //当*String所指向的字符等于\0时跳出循环
     {
          i=*String;
          printf("%c", i);
          String++;

     }
     if(*String=='\0'){          //再次确认字符串的末尾是否有\0字符存在
          printf("\\0");          //有则打印出来
     }else{
          printf("**");          //没有则打印**
     }
     printf("\nMYPHONE=%s\n", &MYPHONE);          //打印字符串 这里%s的s必须为小写

/**************验证SMS字符串末尾是否有\0字符****************/
     String=SMS;
     while(*String)               //当*String所指向的字符等于\0时跳出循环
     {
          i=*String;
          printf("%c", i);
          String++;

     }
     if(*String=='\0'){          //再次确认字符串的末尾是否有\0字符存在
          printf("\\0");          //有则打印出来
     }else{
          printf("**");          //没有则打印**
     }

     printf("\nSMS=%s\n", &SMS);          //打印字符串 这里%s的s必须为小写

}
 
运行效果图:

文章评论5条评论)

登录后参与讨论

用户1639758 2014-5-9 11:59

专业做Audio Codec,有意者加qq296163816

用户1167151 2013-4-17 06:23

我试过,至少gcc和visual C会在字符串结尾添加0。有一种情况编译器是不会添加0的,就是两个字符串联在一起写,前面的不会加0,只有最后一个会加0。比如: char s[]="test1" "test2" "test3"; 和 char s[]="test1test2test3"等同。

用户1167151 2013-4-17 03:07

"指向宏定义是明显的语法错误"不对。(很显然,博主编译过了并且有运行结果。) 宏定义本身当然是没有内存地址的,可是预处理程序会把宏替代为字符串,如果宏定义为字符串的话。

wgjoicq_354153506 2013-4-16 14:52

C语言是不会在字符串最后自动加0的, 必需显式的添加; 没有显式的加0,运行结果将显得不可预测,如果字符串后一位,正好是初始化后的0, 结果是正确的, 如果不是, 就不知道会显示什么了; 指针,需要指向一个实际的内存地址,指向宏定义是明显的语法错误,指针指向 变量或常量都没问题, 宏定义是没有内存地址的.

用户1167151 2013-4-16 07:40

说实在的,我不相信宏定义会导致不同的编译结果。因为从本质上来说,宏定义的处理是属于预处理的一部分,还没到编译的时候。要是有不一样,那是你的编译器对于字符串指针和字符串数组的处理的不一样。你可以这样试:不要写 String=MYPHONE; 而是,直接写 String="AT+CMGS"; 这样已经没有宏定义了,但是我敢肯定,运行结果和现在一样。

用户1602177 2013-4-7 15:52

最后的运行效果图木有看到阿,博主请补上阿~~
相关推荐阅读
用户1653598 2013-04-06 17:04
《说说那几款查看源代码的工具》---转载自 ytfdhb的博客
说说那几款查看代码的工具 发布时间:2013-03-25 20:48:21 今天给大家介绍几款单片机工程师所喜欢的几款查看源代码的工具,这几款工具在懒猫的日常工作中可是帮了不少忙...
用户1653598 2012-12-28 22:59
最好的单片机视频教程(我自己都在看哦,思路一下子清晰了!)
51Hei单片机视频教程 http://www.51hei.com/sp/ ...
用户1653598 2012-11-25 20:35
如何用万用表测定数码管是共阴还是共阳?
下面以常见的4位数码管为例来说明 实现步骤 一、打开万用表电源,转到二极管档。 二、万用表的红笔或黑笔固定在数码管的任一引脚上。 三、另一颜色的笔遍历其他所有引脚。 四、...
用户1653598 2012-11-12 15:25
#什么是嵌入式#请看freescale公司做的这个视频短片
#什么是嵌入式#请看freescale公司做的这个视频短片...
用户1653598 2012-11-02 22:21
ARM指令集(51条)
  不同的ARM体系结构版本支持的指令是不同的,但是新的版本一般是增加指令并且保持指令的向后兼容。 也就是说,在ARMv4T上写的代码在ARMv5TE处理器上也是可以运行的。下表...
我要评论
5
29
关闭 站长推荐上一条 /2 下一条