其他分享
首页 > 其他分享> > 2021.8.25

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