C语言字符串

字符串

字符串字面量

字符串字面量是用一对双引号括起来的字符序列。
例:"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

			格式: strcat (字符数组1,字符数组2)

功能:把字符数组 2 中的字符串连接到字符数组 1中 字符串的后面,并删去字符串1后的串标志“\0”。
本函数返回值是字符数组 1 的首地址。

函数原型
char* strcat(char* s1,const char* s2);

字符串复制函数 strcpy

			格式: strcpy (字符数组1,字符数组2)

功能:把字符数组 2 中的字符串拷贝到字符数组 1 中;串结束标志“\0”也一同拷贝。
说明:
字符数组 1 必须足够大,以容纳字符数组 2。
字符数组 1 必须是一个字符数组名。
字符数组 2 可以是一个字符数组名,也可以是一个字符串常量。
一个字符串拷贝到另一个字符数组中去,只能使用 strcpy 函数。
可以使用 strncpy 函数将字符串 2 中前面 n 个字符复制到原来字符数组 1 中前面 n 个字符。

函数原型
char* strcpy(char* s1,const char* s2);

字符串比较函数 strcmp

			格式: strcmp(字符串1,字符串2)

功能:将两个字符串自左至右逐个字符相比,直到出现不同的字符或遇到“\0”为止。

  • 字符串1 = 字符串2,返回值 = 0;
  • 字符串1 < 字符串2,返回值 < 0;
  • 字符串1 > 字符串2,返回值 > 0。
函数原型
char* strcpy(const char* s1,const char* s2);

字符串长度函数 strlen

		 格式:strlen(字符数组)

功能:测试字符串实际长度。
也可直接测试字符串常量的长度:strlen("China");

函数原型
char* strlen(const char* s1);

转换小写字母的函数 strwr

			格式:strwr(字符串)

功能:将字符串中大写字母换成小写字母。

转换大写字母的函数 strupr

			格式:strupr(字符串)

功能:将字符串中小写字母换成大写字母。

字符串输出函数 puts

			格式: puts (字符数组)

功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串。
在写完字符串后,puts 函数总会添加一个额外的换行符,从而前进到下一个输出行的开始处。

字符串输入函数 gets

			格式: gets (字符数组)

功能:从标准输入设备键盘上输入一个字符串。
gets 函数得到一个函数值,即为该字符数组的首地址。
gets 函数不会在开始读字符串之前跳过空白字符(scanf 函数会跳过)。
gets 函数会持续读入直到找到换行符才停止(scanf 函数会在任意空白字符处停止)。
此外,gets 函数会忽略掉换行符,不会把它存储到数组中,用空字符代替换行符。

你可能感兴趣的:(C语言,c语言,字符串)