2021.8.25
作者:互联网
字符串
以0(整数0)结尾的一串字符,0和‘\0"一样,但和‘0’不同,0标志字符串的结束,但他不是字符串的一部分。
计算字符串长度时不包含这个0.
字符串以数组的形式存在,以数组或指针的方式访问。更多的是以指针的形式
string.h里有很多处理字符串的函数。
字符串变量
char *str=“Hello” char word[]="Hello" char line[10]="Hello"
字符串字面量(字符串常量)
双引号“Hello”,会被编译器变成一个字符数组放在某处,这个数组的长度是6,结尾还有表示结束的0.
两个相邻的字符串常量会被自动连接起来。
小结
C语言的字符串是以字符数组的形态存在的
不能用运算符对字符串做运算
通过数组的方式可以遍历字符串
唯一特殊的地方是字符串字面量可以用来初始化数组。
以及标准库通过了一系列字符串函数
字符串变量
chat *s="Hello World!",字符串在代码段中;s是一个指针,初始化为指向一个字符串常量。
由于这个常量所在的地方,所以实际上const char* s,但是由于历史原因,编译器接受不带const的写法
但是试图对s所指的字符串做写入会导致严重的后果
如果需要修改字符串,应该用数组:char s[]=“Hello World!”;代码段被拷贝
指针还是数组?
char* str=“Hello” char word[]="Hello"
数组:这个字符串在这里,作为本地变量空间自动被回收。
指针:这个字符串不知道在哪里。处理参数。动态分配空间。
如果要构造一个字符串——>数组
如果要处理一个字符串——>指针
char* 是字符串?
字符串可以表达为char*的形式,char*不一定是字符串
本意是指向字符的指针,可能指向的是字符的数组(就像int*一样)
只有它所指的字符数组有结尾的0,才能说它所指的是字符串。
字符串的输入输出
字符串赋值
char *t="title" char *s s=t
并没有产生新的字符串,只是让指针s指向了t所指的字符串,对s的任何操作就是对t做的。
字符串输入输出
char string[8]; scanf(“%s”,string);printf("%s",string)
scanf读入一个单词(到空格,tab或回车为止)
安全的输入
char string[8]; scanf("%7s",string);
scanf("%7s",string);
在%和s之间的数字表示最多允许读入的字符的数量,这个数字应该比数组的大小小1
下一次scanf从哪里开始?
常见错误
char* string;scanf ("%s",string);
以为char* 是字符串类型,定义了一个字符串类型的变量string就可以直接使用了。
由于没有对string初始化为0,所以不一定每次错运行都出。
空字符串
char buffer[100]=“”; 这是一个空的字符串,buffer[0]==‘\0'
char buffer[]=" ";这个数组的长度只有1
字符串数组与程序参数
字符串数组
char **a,a是一个指针,指向另一个指针,那个指针指向一个字符(串)
char a[][]--->一个矩形(行列),char *a[],每行都是一个指针,指向一个字符串(只有一列)
程序参数
int main(int argc,char const*argv[])
argv[0]是命令本身
当使用Unix的符号链接时,反映符号链接的名字
单字符输入输出用putchar和getchar
putchar
int putchar(int C)
向标准输入写一个字符。
返回写了几个字符,EOF(-1)表示写失败。
getchar
int getchar(void)
从标准输入读入一个字符
返回类型是int是为了返回EOF(-1)来表示输入结束了。
windows--->ctrl z
字符串函数
string.h:strlen,strcmp,strcpy,strcat,strchr,strstr
strlen
size_t strlen(const char *s) 返回字符串长度(不包括结尾的0)
strcmp
int strcmp(const char *s1,const char *s2)
比较两个字符串,返回:
0:s1==s2; 1:s1>s2 ; -1: s1<s2
strcpy
char *strcpy(char *restrict dst,const char *restrict src);
把src的字符串拷贝到dst,restrict表明src和dst不重叠(C99)
返回dst,为了能连起代码来
其中dst 和 src不能重叠
复制一个字符串
char *dst=(char*)malloc(strlen(src)+1); 申请空间大1
strcpy(dst,src);
while最后循环出去让dst[idx]='\0'或者src[idx]
或者
char* mycpy
char* ret=dst
while(*dst++=*src++);
*dst='\0'
strcat
char* strcat(char *restrict s1,const char *restrict s2)
把s2拷贝到s1的后面,接成一个长的字符串
返回s1,s1必须有足够的空间 dst[strlen(dst)]=src[0]
安全问题:
strcpy和strcat都可能出现安全问题。如果目的地没有足够的空间?
安全版本:
char *strncpy(char *restrict dst,const char *restrict src,size_t n);
char *strncat(char *restrict s1,const char *restrict s2,size_t n);
int strncmp(const char* s1),const char* s2,size_t n)
字符串中找字符
char* strchr(const char* s,int c);从左到右,c第一次出现的位置,返回指针
char* strrchr(const char* s,int c);从右到左
返回NULL表示没有找到。
如何找第二个?---y有两个套路
字符串中找字符串
char *strstr(const char *s1,const char *s2)寻找字符串
char *strcasestr(const char *s1,const char *s2)寻找过程中会忽略大小写
标签:25,const,string,2021.8,dst,char,字符串,s1 来源: https://blog.csdn.net/weixin_59745161/article/details/119910349