第十章 字符串
10.1 字符串的存储
C语言没有为字符串提供数据类型,因此字符串存取用字符数组实现
为便于确定字符串长度,编译器会在字符串末尾自动加'\0',因此定义字符数组时留出'\0'位置
10.2 字符串定义和初始化
-char a[]="asdfghjk";
-char a[][10]="dhjahrugfhjkajgkfyrkjkj";
【注意】二维数组必须知道每一列的元素个数才能为数组分配存储单元
-char longstring[]="dkafhgajfgjhfdjahjfkjjalklf"
"and dfhjalgkgklfhkksjfgl";
字符串太长可以分成几个小段,在最后一段加“;"
10.3 字符指针
-char *p="hello";
同数组名是数组首地址,函数名是函数入口地址,字符串本身代表存储区的首地址
【注意】hello存储在只读区,p可以改变指向,但不可以改变hello
*p='W'[×]
-char str[10]="hello";
char *p=str;
p的指向可以被修改,hello也可以被修改
*p='W'相当于str[0]='W'
10.4 字符串的输入和输出
(1) for(i=0;str[i]!='\0';i++)
scanf("%d",&str[i]);
同理输出
(2) scanf("%s",str);
printf("%s",str);
【注意】scanf读入一个字符串,直到遇到空白符,空格符,回车符,制表符为止
若输入asd fgh,则asd读入,fgh和它前面的空格留在输入缓冲区内,下次scanf输出
(3) gets(str);
puts(str);
另一种用法*p,puts(p)
【注意】 gets将'\n'读走,并换成'\0',scanf则将'\n'留在缓冲区内
puts遇到第一个'\n'输入结束,并自动输入一个换行符
(4) fgets(name,sizeof(name),stdin);
【注意】scanf gets 均不能限制输入字符的个数,会造成缓冲区溢出
fgets 限制了输入字符个数不能超过数组长度,比较安全
10.5 字符串处理函数
一想到对字符串的操作,应先到用字符串处理函数,不能像普通类型一样操作
1.strlen(str) 函数返回值是str实际长度,不包括'\0'
sizeof(str) 值等于函数下标*数据类型大小
2.strcpy(str1,str2) str2复制到str1当中,应确保str1的大小大于str2
3.strcmp(str1,str2) str1>str2 返回值大于0
str1=str2 返回值等于0
str1<str2 返回值小于0
4.strcat(str1,str2) str1的'\0'被str2的第一个值覆盖,应将str1定义的足够大
5.strncpy(str1,str2,n) 将str2的前n个字符复制到str1当中
6.strncmp(str1,str2,n) 最多比较n个字符
7.strncat(str1,str2,n)
search 例10.4
10.6 向函数传递字符串
两种方法 字符函数做函数参数,靠i动;字符指针做函数参数,靠p++动
search 例10.5,10.6
10.7 从函数返回字符串指针
-实际上,字符串的很多处理函数没有返回值,但它们原型,返回值是字符指针的值
e.g char *strcpy(char *str1,const char *str2)
返回值是字符指针str1,即str1的首地址
-接到第九章的问题
指针的作用:指针作为函数参数传递实参的地址
函数指针:int asd();int (*p)=&asd,p指向函数名
在第十章
指针的作用:函数可以返回实参地址
search 例10.7