字符串字面量是用一对双引号括起来的字符序列。
例:"When you come to a fork in the road,take it."
如果发现字符串字面量太长而无法放置在单独一行以内,只要把第一行用字符 \
结尾,那么 C 语言就允许在下一行延续字符串字面量。
printf("When you come to a fork in the road, \
take it. --Yogi Berra");
除了(看不到的)末尾的换行符,在同一行不可以有其他字符跟在 \
后面。
使用\
有一个缺陷:字符串字面量必须从下一行的起始位置继续。
从本质而言,C语言把字符串字面量作为字符数组来处理。
当C语言编译器在程序中遇到长度为 n 的字符串字面量时,它会为字符串字面量分配长度为 n+1 的内存空间。
这块内存空间将用来存储字符串字面量中的字符,以及一个用来标志字符串末尾的额外字符(空字符)。
空字符是一个所有位都为 0 的字节,用转义序列“\0
”来表示。
通常情况下可以在任何C语言允许使用 char *
指针的地方使用字符串字面量。
char * p;
p = "abc"; //p存储字符串首字母所在地址
C语言允许对指针取下标,因此可以对字符串字面量取下标:
char ch;
ch = "abc"[1]; //ch存储字符b
只包含一个字符的字符串字面量不同于字符常量。
以'a'
和 "a"
为例:
"a"
是用指针来表示的,这个指针指向存放字符 'a'
的内存单元。'a'
是用整数(字符集的数值码)来表示的。"a"
是两个字符,隐含了一个空字符“\0
”。'a'
仅代表自身一个字符。字符数组可以使用字符串字面值初始化:
char data[8] = { "June 14" }; //等价于 char data[8] = {'J','u','n','e',' ','1','4','\0'};
char data[8] = "June 14"; //可以省略花括号
编译器将把字符串中的字符复制到数组中,然后追加一个空字符 “\0
”,从而使该数组可以作为字符串使用。
计算数组长度一定要计算空字符。
如果初始化式太短以致于不能填满字符数组,编译器会将剩余空间添加空字符 “\0
”。
char data[9] = "June 14"; //等价于 char data[8] = {'J','u','n','e',' ','1','4','\0','\0'};
在字符数组的定义中可以省略它的长度;这种情况下,编译器会自动计算长度:
char data[] = "June 14"; //等价于 char data[8] = {'J','u','n','e',' ','1','4','\0'};
当字符数组逐个字符赋值初始化时,需手动添加“\0
”结束符。
例:char c[] = {'I',' ','a','m',' ','h','a','p','p','y','\0'};
char data[] = "June 14"; //字符数组
char * data = "June 14"; //字符指针
例:
char planets[][8] = {"Mercury","Venus","Earth",
"Mars","Jupiter","Saturn",
"Uranus","Neptune","Pluto");
存储 8 个字符串,即二维数组有 8 行;字符个数最大为 8,即二维数组有 8 列。
并非所有的字符串都足以填满数组的一整行,所以 C 语言用空字符来填补。
字符型指针数组,存放字符串的起始地址。
char* str[] = { "C++","Python","Java","BASIC" };
printf("%s\n", str[2] ); //输出str[2]指向的字符串 Java
printf("%c\n", *str[2] );//输出str[2]指向的字符串中的第一个字符 J
char** p = str + 2;
printf( "%s\n", *p ); //输出str[2]指向的字符串 Java
printf( "%c\n", **p ); //输出str[2]指向的字符串中的第一个字符 J
命令行信息不仅对操作系统命令可用,它对所有程序都是可用的。
为了能够访问这些命令行参数(C标准中称为程序参数),必须把 main 函数定义为含有两个参数的函数,这两个参数通常命名为 argc 和 argv:
int main(int argc, char *argv[])
{
}
argc(“参数计数”)是命令行参数的数量(包括程序名本身)
argy(“参数向量”)是指向命令行参数的指针数组,这些命令行参数以字符串的形式存储。
argv[0]
指向程序名,而从 argy[1]
到 argv[argc-1]
则指向余下的命令行参数。
argv 有一个附加元素,即argy[argc]
,这个元素始终是一个空指针。
C语言的函数库为完成对字符串的操作提供了丰富的函数集。
这些函数的原型驻留在
头文件中。
格式: strcat (字符数组1,字符数组2)
功能:把字符数组 2 中的字符串连接到字符数组 1中 字符串的后面,并删去字符串1后的串标志“\0
”。
本函数返回值是字符数组 1 的首地址。
char* strcat(char* s1,const char* s2);
格式: strcpy (字符数组1,字符数组2)
功能:把字符数组 2 中的字符串拷贝到字符数组 1 中;串结束标志“\0
”也一同拷贝。
说明:
字符数组 1 必须足够大,以容纳字符数组 2。
字符数组 1 必须是一个字符数组名。
字符数组 2 可以是一个字符数组名,也可以是一个字符串常量。
一个字符串拷贝到另一个字符数组中去,只能使用 strcpy 函数。
可以使用 strncpy 函数将字符串 2 中前面 n 个字符复制到原来字符数组 1 中前面 n 个字符。
char* strcpy(char* s1,const char* s2);
格式: strcmp(字符串1,字符串2)
功能:将两个字符串自左至右逐个字符相比,直到出现不同的字符或遇到“\0
”为止。
char* strcpy(const char* s1,const char* s2);
格式:strlen(字符数组)
功能:测试字符串实际长度。
也可直接测试字符串常量的长度:strlen("China");
char* strlen(const char* s1);
格式:strwr(字符串)
功能:将字符串中大写字母换成小写字母。
格式:strupr(字符串)
功能:将字符串中小写字母换成大写字母。
格式: puts (字符数组)
功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串。
在写完字符串后,puts 函数总会添加一个额外的换行符,从而前进到下一个输出行的开始处。
格式: gets (字符数组)
功能:从标准输入设备键盘上输入一个字符串。
gets 函数得到一个函数值,即为该字符数组的首地址。
gets 函数不会在开始读字符串之前跳过空白字符(scanf 函数会跳过)。
gets 函数会持续读入直到找到换行符才停止(scanf 函数会在任意空白字符处停止)。
此外,gets 函数会忽略掉换行符,不会把它存储到数组中,用空字符代替换行符。