1、字符串的概念
字符串是位于双引号中的字符序列,在内存中以“\0”结束,所占字节比实际多一个。
注意: C语言中没有字符串变量,可以用字符数组来存放字符串。
2、字符数组
char 数组名[常量表达式] ;
例:
char c[10];
注意:定义字符数组时,应确保数组长度比字符串长度至少多1。
3、字符数组的初始化
1)用数组表示:
(1)用多个字符赋值的情况与数组的初始化方法一样!
如:
char str[] = {‘a’,’b’,’c’,’\0’};
注意:如果申明时不指定数组长度,请记得在字符结尾加’\0’否则可能会输出奇怪的东西或者运行时程序崩溃
注意:未被使用的元素均被自动初始化为0
(2)直接用字符串赋值 语法:
char 数组名[] = “字符串内容”; 或 char 数组名[] = {“字符串内容”};
如:
char str[] = “abc”; 或 char str[] = {“abc”};
注意:不需要加\0,编译器会自动添加,如加上\0也不会报错,并且也是会正常打印出数 据,但是数组的长度会加一个!
2)用指针表示
用char类型的指针也可以表示一个字符串
语法:
char *指针名 = “字符串”;
例:
char *p = “abc”;
4、用数组表示和用指针表示的区别:
1)用数组表示法可以接收用户输入的字符串并保存起来,但是指针不可以
2)用数组表示法可以修改字符串,但是指针不可以
5、字符数组的输入输出
1)使用的格式字符串为“%s”,表示输入、输出的是一个字符串。
用printf函数和scanf函数一次性输出输入一个字符数组中的字符串,而不必使用循环语句逐个地输入输出每个字符。
注意:在C语言中规定,数组名代表了该数组的首地址,整个数组是以首地址开头的一块连续的内存单元。
2)字符串输出函数 puts
格式: puts(字符数组名)
功能:把字符数组中的字符串输出到显示器。 即在屏幕上显示该字符串。 从程序中可以看出puts函数中可以使用转义字符,因此输出结果成为两行。puts函数完全可以由 printf函数取代。 当需要按一定格式输出时,通常使用printf函数。
字符串输入函数 gets
格式: gets (字符数组名)
功能:从标准输入设备键盘上输入一个字符串。
注意:gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束,这是与scanf函数不同的。
6、字符串的常用函数
C语言��供了丰富的字符串处理函数,大致可分为字符串的输入(scanf)、输出(printf)、合并(strcat)、修改、比较(strcmp)、转换、复制(strcpy)、搜索(strstr、strchr)几类。
用于输入输出的字符串函数,在使用前应包含头文件”stdio.h”,
使用其它字符串函数则应包含头文件”string.h”。
1)字符串连接函数 strcat
格式: strcat(字符数组名1,字符数组名2) 功能:把字符数组2中的字符串连接到字符数组1中字符串的后面,并删去字符串1后的串标志 “\0”。本函数返回值是字 符数组1的首地址。
2)字符串拷贝函数strcpy
格式: strcpy(字符数组名1,字符数组名2) 功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“\0”也一同拷贝。字符数名2, 也可以是一个字符串常 量。这时相当于把一个字符串赋予一个字符数组。 本函数要求字符数组1应有足够的长度,否则不能全部装入所拷贝的字符串。
3)字符串比较函数strcmp
格式: strcmp(字符数组名1,字符数组名2) 功能:按照ASCII码顺序比较两个数组中的字符串,并由函数返回值返回比较结果。 字符串1=字符串2,返回值=0; 字符串1>字符串2,返回值>0; 字符串1<字符串2,返回值<0。 本函数也可用于比较两个字符串常量,或比较数组和字符串常量。
4)测字符串长度函数strlen
格式: strlen(字符数组名) 功能:测字符串的实际长度(不含字符串结束标志‘\0’)并作为函数返回值。
5)字符串查找
最简单的是查找字符串查找字符:
char *strchr(const char *s, int c);
至于参数为什么是int,历史遗留问题,这里不多讨论。函数返回在s中找到的第一个c的位置的指针,注意的是,字符串末尾的‘\0’也是可以被查找的。实现如下:
[cpp] view plaincopy
char *my_strchr(const char *s, int n){
assert(s != NULL);
char c = (char)n;
do{
if(*s == c)
return (char *)s;
}while(*s++);
return NULL;
}
还有查找字符串的函数strstr:
char *strstr(const char *s1, const char *s2);
函数返回s2在s1中出现的首字符的位置,实现如下:
[cpp] view plaincopy
char *my_strstr(const char *s1, const char *s2){
assert(NULL!=s1 && NULL!=s2);
size_t len = strlen(s2);
while(*s1){
if(!strncmp(s1,s2,len))
return (char *)s1;
s1++;
}
return NULL;
}
c标准库中并没有定义类似strnchr和strnstr的限定查找范围的函数,当然需要的话我们可以自己定义