一.字符串
1.以整数0结尾的一串字符;
2.0和‘\0’是一样的,但是和‘0’不同;
3.0标志字符串的结束,但不是字符串的一部分,并且计算字符串长度时候不包含这个0;
4.字符串以指针的形式存在,以数组和指针的形式访问,更多的是以指针的形式;
5.在<string.h>里有很多处理字符串的函数;
例如:
char* str=“hello”;
char word[]=“hello”;
char line[10]=“hello”;
"…"里的是字符串常量;
6.不能用运算符对字符串做运算,但是可以用数组遍历;
7.唯一特殊的地方就是字符串字面量(“”)可以用来初始化字符数组,就是C语言能够识别;
二.字符串常量
1.char* s=“hello.world” --> const char* s;
2.s是一个指针,初始化为指向一个字符串常量;
3.字符串只能读不能写,如果想要修改字符串应该用数组;
chart s[ ]=“hello,world”;
三.指针和数组
指针:char* str = "hello”;
数组:char word[ ]=“hello”;
对于数组: 1.表示字符串在这里;
2.作为本地变量空间自动被收回;
对于指针: 1. 不知道这个字符串在哪里;
2.可以用来处理参数,给它分配一个空间(malloc);
所以:
如果要构造一个字符串 ---->数组;
如果要处理一个字符串 ---->指针;
字符串可以表示为char的形式,但是char不一定是字符串,本意是指向字符的指针,可能指向的是字符串的数组(想int一样)只有char所指的字符串数组有结尾的0时才能说它所指的是字符串。
四.字符串的输入输出
1.
#include<stdio.h>
int main(void){
char string[8];
char string2[8];
scanf("%7s",string);
scanf("%7s",string2);
printf("%s##%s##\n",string,string2);
char buffer[100]="";
printf("%s",buffer[0]);
return 0;
}
scanf是不安全的,因为不知道要读入的内容的长度,可以在%s中间加一个7---->%7s
%as -------> a比数组的大小小一;
2.
char* string;
scanf("%s",string);
这样看起来是正确的,但是错误的认为char*是字符串类型,定义了一个字符串类型的变量string就可以直接使用了,但是没有对本地变量string初始化为0。但是不一定每次运行都出错,注意。
添加
int main(int argc , char const *argv[]) :main中的参数,int表示数组有几个字符串。
putchar
int putchar(int c); 向标准输出写一个字符。 EOF表示写失败。
getchar
int getchar(void); 向标准输入读入一盒字符。
如果返回类型是int是为了返回EOF(-1)。
#include<stdio.h>
int main(int argc,char const *argv[])
{
int ch;
while((ch=getchar())!=EOF){
putchar(ch);
}
return 0;
}
Ctrl z退出程序。
字符串函数
1.strlen
size_t strlen(const char*);
返回S的字符串长度(不包含结尾的0);
2.strcmp
int strcmp(const chars1,const chars2);
比较两个字符串,返回;
0:s1==s2;
1:s1 > s2;
-1:s1 < s2;
#include<stdio.h>
#include<string.h>
int mycmp(const char* s1,const char* s2){
//int idx=0;
//while(s1[idx]==s2[idx]&&s1[idx]!='0'){
// if(s1[0] != s2[0]){
// break;
// }else if(s1[idx] == '\0'){
// break;
// }
// idx ++;
while(*s1 == *s2&& *s1!='\0'){
s1++;
s2++;
}
return *s1-*s2;
} //自己给出的strcmp;
int main(int argc,char const *argv[]){
char s1[]="abc";
char s2[]="abc ";
printf("%d\n",mycmp(s1,s2));
return 0;
}
3.strcpy
char* strcpy(char* restrict dst,const char* restrict src)
1.把src的字符串拷贝到dst,返回dst。
2.restrict表面src和dst不重叠。
3.为了能链起代码来。
做什么:复制一个字符串。
char* dst = (char*)malloc(strlen(src)+1);
strcpy(dst,src);
#include<stdio.h>
#include<string.h>
char* mycoy(char* dst,const char* src)
{
int idx =0;
while(src[idx]!=0){
dst[idx]=src[idx];
idx ++;
}
dst[idx]='\0';
return dst;
}//等同于strcpy.
int main(){
char s1[]="";
char s2[]="abc";
strcpy(s1,s2);
printf("%s\n",strcpy(s1,s2));
return 0;
4.strcat
char* strcat(char* restrict s1,const char* restrict s2);
把s2拷贝到s1后面接成一个长的字符串,返回s1并且具有足够的空间。
dst [strlen(dst)]=src[0];
strcpy和strcat都可能出现问题,因为目的地不能保证有足够的空间。
安全版本
char* strncpy(char* restrict dst,condt 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 chars,int c);从左边寻找第一个C,给的是指针;
char strrchr(const char*s,int c);从右边寻找;
#include<stdio.h>
#include<string.h>
int main(int argc,char const *argv[])
{
char s[]="hello";
char *p=strchr(s,'l');
// p =strchr(p+1,'l') ;
printf("%s\n",p);
return 0;
}