【 C 】关于相邻字符串常量自动合并的标准(新旧标准)(新旧风格)(陷阱)
如果一个字符串太长了,我们需要把它分行来写,旧式风格是这样来做的:
1 #include<stdio.h>2 #include<stdlib.h>3 int main()4 {5 printf( "I love you not because of \6 who you are, but because of \7 who I am when I am with you.\n"8 );9 return 0;10 }11
编译并运行得到如下结果:
这是什么鬼呀,虽然也得到了结果,可是这显示的也太出乎意料了吧。哪位大佬知道,可以告诉我哪里出问题了。
ANSI C引入的另一种新特性是相邻的字符串常量将被自动合并成一个字符串的约定。这就省掉了过去在书写多行信息时必须在行末加"\"的做法。
现在用一连串的字符串常量来代替它,它们会在编译时自动合并。除了最后一个字符串外,其余每个字符串末尾的NUL字节('\0')会被自动删除。如下:
新式风格:
1 #include<stdio.h>2 #include<stdlib.h>3 int main()4 {5 printf( "I love you not because of "6 "who you are, but because of "7 "who I am when I am with you.\n"8 );9 return 0;10 }11
Linux下编译运行结果如下:
显示的还不错。
然而,这种自动合并意味着字符串数组在初始化时,如果不小心漏掉一个逗号,编译器将不会发出错误信息,而是悄无声息地把两个字符串合并在一起。这在下面的例子中引起可怕的后果:
1 #include<stdio.h>2 #include<stdlib.h>3 #include<string.h>4 5 int main()6 {7 char *available_resource[] = {8 "reborn lee",9 "Soul Da",10 "vickey"//这里少了一个逗号!11 "dog",12 "mouse",13 "keyboard",14 "family", //这个逗号会引起什么问题吗? 15 };16 17 char *src = malloc( 20 * sizeof( char ) );18 if(src != NULL)19 strcpy( src, available_resource[3] );20 else21 printf( "memory allocation false!\n" );22 23 printf( "I love %s\n", available_resource[2] );24 // strcpy( src, available_resource[3] );25 printf( "puppy is a name of %s\n", src );26 free( src );27 return 0;28 }29
结果如下:
root@reborn-pc:~# vim test.c
root@reborn-pc:~# gcc test.c
root@reborn-pc:~# ./a.out
I love vickeydog
puppy is a name of mouse
root@reborn-pc:~#
上面的这段程序中,我们很容易发现,第三个字符串后少了一个逗号,这样的话,按照ANSI C标准,就会自动的把它和下一个字符串合成一个字符串,所以呢?如果我们想要得到第三个字符串的内容,本来使用available_resource[2]打印出来就可以了,正如上例中的语句:
23 printf( "I love %s\n", available_resource[2] );
本来我想说的是:I love vickey,但是结果却打印成了:I love vickeydog,这样,如果vickey是我的女朋友,她看到岂不是误会我骂她,所以不能疏忽!
同样,这条语句:
19 strcpy( src, available_resource[3] );
25 printf( "puppy is a name of %s\n", src );
我想表达的是puppy is a name of dog,但是由于那个逗号的遗忘,意思也变了,打印出来的字符串变成了:puppy is a name of mouse
我的天呀,意思千差万别,puppy怎么会是一个老鼠的名字。我家的宠物狗叫puppy好吧。
哈哈,通过上面貌似扯淡的讨论,其实道出了一个问题,就是如果忘掉了一个逗号,编译器也不会报错,但是得到的答案却千差万别,所以要谨防这种问题的出现。
最后需要说的是,程序中的最后一个字符串后面的逗号:
14 "family", //这个逗号会引起什么问题吗?
这个地方有没有问题呢?
其实是没有问题的,你也不要怀疑作者是不是多打了一个逗号,事实上,它并不是一个错误,而是从最早的C语法中继承下来的东西,不管存在与否都没有意思!所以见怪不怪吧!
【 C 】关于相邻字符串常量自动合并的标准(新旧标准)(新旧风格)(陷阱)相关推荐
- [转载] java常量池-字符串常量池、class常量池和运行时常量池
参考链接: 如何在Java中初始化和比较字符串 原文链接:http://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool ...
- 字符串常量池、class常量池和运行时常量池
原文链接:http://tangxman.github.io/2015/07/27/the-difference-of-java-string-pool/ 在java的内存分配中,经常听到很多关于常量 ...
- 字符串常量在内存中的存放位置由系统自动安排。_C++核心编程--内存分区模型...
1 内存分区模型 C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的 全局区:存放全局变量和静态变量以及常量 栈区:由编译器自动分配释放, 存放函数的 ...
- JVM(1)之JVM的组成详解(字符串常量池+双亲委派机制+JIT即时编译......)
以下总结自:<深入理解java虚拟机> + 宋红康老师视频 字节码文件介绍:深入理解JVM之Java字节码(.class)文件详解_Windy_729的博客-CSDN博客_字节码文件 JV ...
- element 表格单元格内容不换行_实例29_在Word表格中将上下行相同内容的单元格自动合并...
实例28讲了如何在Excel文件中自动合并上下行相同内容的单元格,此例则讲一讲如何在Word文件中做类似的操作.因为处理Excel和Word的模块是不同的,所以合并单元格也有一些差异.相对来说,Wor ...
- 字符串常量到底存放在哪个存储区
字符串常量,放在哪个存储区呢?是"自动存储区"还是"静态存储区"中? 比如: char *pstr="hello world!"; 这里,& ...
- 修改docx表格_实例29_在Word表格中将上下行相同内容的单元格自动合并
实例28讲了如何在Excel文件中自动合并上下行相同内容的单元格,此例则讲一讲如何在Word文件中做类似的操作.因为处理Excel和Word的模块是不同的,所以合并单元格也有一些差异.相对来说,Wor ...
- JVM---StringTable(字符串常量池)
StringTable(字符串常量池) 字符串常量池 StringTable(字符串常量池) String的基本特性 String 的底层结构 String 的内存分配 String 的基本操作 字符 ...
- 字符串常量是一个字符数组
1 #include<iostream>2 using namespace std;3 4 int main()5 {6 char var = '5';7 char *p_var;8 p_ ...
最新文章
- vue下实现textarea类似密码框的功能之探索input输入框keyup,keydown,input事件的触发顺序...
- CORE协议的MATLAB仿真
- 关于重写session实现的时候可能会导至nginx 502的问题
- UOJ #592. 投放点的选择
- 重定向 12 21 解析
- 如何打造高效的多任务、高并发的网络服务器系统?
- WebSocket剖析
- 关于Google Guava的几个问题
- 用Oracle归档日志进行恢复方法
- Servlet笔记10--Session
- web 前端小记_1 :hasLayout
- paip.提高用户体验----c++图片按钮方法总结
- 让一个.sh文件一直运行_想做AI鉴黄工具?这有一个内含20多万张“不可描述”图片的数据集...
- 智能额温枪软件设计红外测温仪方案开发
- 巧用友盟UShare、ULink玩转裂变营销
- nacos使用mysql8作为存储媒介时报Caused by: com.mysql.cj.exceptions.CJException: Public Key Retrieval is not all
- 注意力缺陷/多动障碍和睡眠障碍之间有什么联系?基于大规模队列多模态研究
- 苹果为富士康员工加薪?
- 【2023年最新版】渗透测试入门教程,手把手带你进阶渗透测试工程师,学完即可就业
- 鲁大师5.12.15.1184 纯净去广告单文件版
热门文章
- install tomcat
- 网页编程,JS模态窗口,子页面向父页面传递值
- 高级政工师具备的能力_一个合格的政工师应该具备哪些条件与素质
- redis在容器里连接不上_Redis服务器被劫持风波,服务器相关知识共享学习
- cad版本在线转换_CAD版本转换中将图纸转换为AutoCAD2018版本的方法
- python读取指定行的txt_【Python】读取txt文件,获取指定行中指定位置数据
- 数据仓库中宽表的设计原则_实际项目中交互设计原则的运用
- 2021年春季学期-信号与系统-第十五次作业参考答案-第三小题参考答案
- 2021年春季学期-信号与系统-第十二次作业参考答案-第七小题
- 两个大功率肖特基二极管的V-A特性