中国大学MOOC--C语言程序设计第十周字符串(下)
10.2字符串函数
10.2-1 单字符输入输出函数
1.putchar
int putchar(int c);
向标准输出写一个字符;
返回写了几个字符,EOF(-1)表示写失败,end of file.
2.getchar
int getchar(void);
从标准输入读入一个字符,返回类型是int是为了返回EOF(-1),表标准输入结束。
shell和键盘和.exe的交互过程:shell的工作是行编辑工作,有一大片缓冲区,在摁下回车之前,输入的数据都在shell里面停留,回车在缓冲区中也占一个位置,getchar一次读一个字符,scanf函数可以读很多,看控制格式;shell看到ctrl Z填一个EOF进去(不同环境实现方式不同),再用getchar去读就读到”-1“
10.2-2 string.h
strlen、cmp、cpy、cat、chr、str
首先来看strlen,如何求字符串的长度,这里注意strlen()和size()对于相同字符串来说结果不同,记住字符串和字符数组的区别
10.2-3 字符串函数strcmp
int strcmp(const char *s1, const char *s2);
比较两个字符串,返回:
0:s1==s2;
1:s1>s2;
-1:s1<s2;
数组的比较用==会发生错误,因为字符在内存中的地址不一样;
10.2-4 字符串函数cpy
一、strcpy函数概念及其格式
restrict(C99新关键字)表明src和dst不能重叠;
现代计算机一般都是多核:当计算机多核时,计算机会把拷贝的工作分成几段,每一个核分别去做某段的拷贝,在这个时候必须要求dst和src不能重叠,如果重叠分开拷贝会发生冲突
在这个函数中第一个参数是目的,第二个参数是源,这个函数还有一个返回,返回字符串dst:让strcpy()的结果参与其他运算
二、strcpy用处
三、自己写cpy函数
数组版本
指针版本
#include<stdio.h> #include<string.h> char *mycpy(char *dst, const char *src);int main() {char s1[]="abc";char s2[]="asdhashdaiud";mycpy(s1,s2);printf("%s",s1);return 0;} char *mycpy(char *dst, const char *src) {char* ret=dst; // while(*src!='\0')//循环条件可以直接改为*src // { // *dst=*src; // dst++; // src++; // //循环内也可以写成*dst++=*src++ // }while(*dst++=*src++);*dst='\0';return ret; }
10.2-5 字符串函数strcat
dst=[strlen(dst)] = src[0];
strcpy和strcat都可能会出现安全问题,若目的地没有足够空间?
尽量不使用!!!!!
cpy和cat的安全版本:第三个字符串比较函数并不是为了安全;第三个函数其中一个用法是看一个字符串前三个字符是不是我们需要判断的字符,参数里面写3即可
10.2-6字符串搜索函数
一、字符串中找字符
上面的函数表示从左往右寻找字符,下面的函数表示从右向左寻找字符。
使指针p指向字符串"hello"里面的第二个'l',方法如下:
#include<stdio.h>
#include<string.h>int main()
{char s[]="hello";char *p=strchr(s,'l');//注意这里++p 和 p++ 和 p+1的区别 p = strchr(++p,'l');printf("%s",p);return 0;}
第二件事情:如何截部分字符串并赋值给另一个字符串?
如果想要字符串前半部分呢?
二、字符串中找字符串
char *strstr(const char *s1, const char *s2); //字符串中寻找字符串
char *strcasestr(const char *s1, const char *s2); //忽略大小写作查询过程