3.4 字符串常量
字符串常量包含一个字符序列(也包括空格),均位于一个双引号中,例如:
“Hello world!/n”
与字符常量一样,字符串常量可以包含源字符集中的所有字符,唯一例外就是使用双引号,反斜杠(/)、换行符等需要通过转义来表示,下面printf语句中首先产生一个警告音,接着,在双引号中指定一个目录,使用%s来替代指针doc_path的地址:
Char doc_path[128] = “.//share//doc”;
Printf(“/aSee the documentation in the directory /”%s/”/n”, doc_path”);
字符串常量是一个静态char数组,它包含以字符串结束符null(/0)结束的字符码。空串””在内存中占用一个字节,因为它包含了null字符。不能用一字节存储的字符使用多字节来存储。
如前面所有的例子,你可以使用一个字符串来初始化一个字符数组,也可以用它来初始化一个char指针:
Char *pStr = “Hello, world!”; //pStr points to the first character, ‘H’
在这种初始化中,字符串常量表示每一个元素的地址,这跟数组名是一样的。
在Example 3-1中,数据error_msg包含3个char指针,每一个赋值一个字符串首字母的地址。
Example 3-1. Sample function error_exit( )
#include <stdio.h>
#include <stdlib.h>
Void error_exit(unsigned int error_n)
{
Char *error_msg[] = {“Unknown error code./n”,
“Insufficient memory./n”,
“Illegal memory access./n”};
Unsigned int arr_len = sizeof(error_msg)/sizeof(char *);
If (error_n > = arr_len)
Error_n = 0;
Fput(error_msg[error_n], stderr);
Exit(1);
}
与宽字符常量一样,你可以使用前缀L在字符串常量中使用宽字符:
L”Here`s a wide-string literal.”
宽字符串常量定义一个以null结束的数组,它的元素类型为wchar_t,数组通过转换多字节为宽字符来初始化,这与标准函数mbstowcs()一样。同样地,使用转义表示的任何通用字符名以单个的宽字符存储。
在下面的例子中, /u03b1表示通用字符a,wprintf()为printf函数的宽字符版本。用来格式化和打印一个宽字符串:
Doubel angle_alpha = 90.0/3;
Wprintf(L”Angel /u03b1 measures %lf degress./n”, angle_alpha);
字符串常量中的任何多字节字符或转义字符均不能在执行时字符集中表示,它们的值取决于编译器。
编译预处理器连接任何以空格隔开的单个相邻字符,如下所示,这种连接使为了字符串易于阅读而分成多行变得容易了:
#define PRG_NAME “EasyLine”
Char msg[] = “The installation of ” PRG_NAME
“is now complete.”;
如果连接的任一字符串是宽字符常量,刚连接后的结果串也为一个宽字符串。
另一种分隔一个字符串为多行的方法是使用反斜杠结束,如下面的例子:
Char info[] =
“This is a string literal broken up into /
Several source code lines./nNow one more line:/n/
That`s enough, the string ends here.”;
字符串将在新行的开始继续,任何在左页边的空格,例如several前的空格,均是字符串的一部分,此外,此串包含了两个换行符,一个在Now前,另一个在that`s之前。
编译器解释转义字符在连接相邻串之前,所以,下面来自一个宽字符串的两个字符串常量以’/xA7’和’2’开始:
L”/xA7” L”2 et cetera”
然而,如果这个串写在一起,如L”/xA72 et cetera”,则串中每个字符为宽字符’/xA72’。
虽然C没有严格禁止修改字符串常量,你也不应该尝试这样做,在下例中,第二个语句就是尝试替换字符串是首字符:
Char *p = “house”; //Initialize a pointer to char
*p = ‘m’; //This is not a good idea!
这个语句不被禁止,但在有些系统上会引起运行时错误,首先,编译器当做一个常量去处理字符串,可能将它置于只读内存,所以试图进行写操作将会引起错误,其次,如果两个或更多的相同串在程序中使用,编译器会将它们存储在相同的位置,所以修改可能会引起另外一个使用它的地方出现异常。
然而,当你使用一个字符串来初始化数组变量,你可以修改数组内容:
Char s[] = “house” //Initialize an array of char
S[0] = ‘m’ //Now the array contains the string “mouse”.
分享到:
相关推荐
### C语言核心技术(C in a Nutshell) #### 知识点概述 《C语言核心技术》是一本由C语言专家Peter Prinz与Tony Crawford合作撰写的权威性书籍,它旨在为C语言程序员提供全面且深入的核心知识和技术指导。本书不仅...
### C语言核心技术(英文文字版) #### 书籍概述 《C语言核心技术》是一本由 Tony Crawford 和 Peter Rinz 合著的经典技术书籍,由著名的 O'Reilly 出版社出版。该书首次发布于2005年12月,全书共计618页,ISBN号...
《C语言技术手册》是一本全面且深入探讨C语言编程的资源,旨在帮助开发者和学习者迅速查询和理解C语言的各种函数及语法特性。CHM(Compiled Help Manual)格式是微软开发的帮助文档格式,通常包含丰富的索引、搜索...
### C语言核心技术(C: In a Nutshell) #### 核心知识点概览 《C语言核心技术》这本书由Tony Crawford和Peter Prinz等作者编写,由O'Reilly出版社于2005年12月出版。全书共有618页,涵盖了C语言的所有核心概念和...
### C语言核心技术——《C in a Nutshell》 #### 一、书籍简介 《C in a Nutshell》是由Tony Rawford和Peter Rinz共同编写的关于C语言的权威指南,出版社为O'Reilly,出版日期为2005年12月,ISBN编号为0-596-00697...
《C语言核心技术》不仅适合C语言初学者快速入门,也适合有经验的程序员作为日常工作的参考手册。该书内容丰富,结构清晰,通过大量实例加深读者对C语言的理解和掌握,是C语言学习者和专业程序员的必备书籍之一。 ...
·提供了mysql语句、函数、配置选项和实用工具的一个完整手册。 ·给出了几个指导章节用于帮助新手入门。 ·为php、perl和c语言提供了应用程序编程接口(api)。 ·在每章的api开头部分提供了简要的指南。 ...
### S3C2416核心板开发板硬件...综上所述,S3C2416核心板及其开发板为各类嵌入式系统设计提供了强大的硬件基础,其详细的硬件手册则为开发者提供了全面的技术指导和法律提示,是进行相关项目开发不可或缺的参考资料。
《C语言核心技术》不仅适合初学者作为C语言学习的快速入门指南,也适合有经验的程序员作为日常工作的实用参考手册。书中深入浅出地讲解了C语言的各个方面,辅以丰富的示例代码,使读者能够在实践中加深理解和记忆。...
根据提供的信息,《LINUX内核技术手册2.pdf》是一本专注于Linux内核配置、构建及安装的专业技术书籍。以下是对该书所涉及的关键知识点的详细总结: ### 一、书籍基本信息 - **书名**: Linux内核技术手册 - **作者*...
《云打印C-Lodop技术手册》是一本详细介绍如何利用C-Lodop进行云端打印操作的技术文档。C-Lodop,全称为Cloud Lodop,是一款高效便捷的云打印解决方案,尤其适用于小票、箱贴、财务单等各类文档的远程打印需求。其...
### C核心技术手册知识点总结 #### 一、C语言的基础语法 **1.1 C的特征** C语言是一种过程式编程语言,由Dennis Ritchie于1970年代初在贝尔实验室开发,最初是为了实现UNIX操作系统及其应用程序能够尽可能地与...
综上所述,《C语言核心技术》这本书不仅是一本C语言的入门指南,还是一本详尽的参考手册。无论是初学者还是有经验的开发者,都能从中受益匪浅。通过系统地学习这些内容,读者可以更高效地使用C语言进行编程,并解决...
【标题】"s3c2440a中文技术手册全"揭示了这是一份针对Samsung S3C2440A处理器的详尽中文参考资料。S3C2440A是Samsung公司推出的一款基于ARM920T内核的微处理器,广泛应用于嵌入式系统设计,如智能手机、PDA、数字...