字符串
以0结尾的一串字符;0或'\0'(整数0)是一样的,但是和'0'(ASCII码中的0)不同
0标志字符串的结束,但它不是字符串的一部分;计算字符串长度的时候不包含这个0
字符串以数组的形式存在,以数组或指针的形式访问;更多的是以指针的形式
string.h 里有很多处理字符串的函数
字符串常量
char *str =“Hello"
char word[] =“Hello"
char line[10] =“Hello" //“Hello" 这个字符串在数组中长度为6(系统会自动补上结尾的0)
两个相邻的字符串常量会自动连起来
C语言的字符串是以字符数组的形态存在的
不能用运算符对字符串做运算
通过数组的方式可以遍历字符串
唯一特殊的地方是字符串字面量可以用来初始化字符数组
指针指向的字符串为只读变量(const)
char *s = "Hello,world ! " ;
s 是一个指针,初始化为指向一个字符串常量
由于这个常量所在的地方,所以实际上s是const char *s ,但是由于历史的原因,编译器接受不带const的写法
但是试图对s所指的字符串做写入会导致严重的后果
如果需要修改字符串,应该用数组:
char s= "Hello,world! " ;
字符串可以表达为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或回车为止),但scanf不知道读入的内容的长度
char string[8];
scanf("%7s", string);
//表示string只能读取最多7位的字符串
//在%和s之间的数字表示最多允许读入的字符的数量,这个数字应该比数组的大小小一
*****定义了字符串指针后一定要初始化为0*****
空字符串
char buffer[100] = "" ;
这是一个空的字符串,buffer[0] ==‘\0’
char buffer[ ] = "" ;
这个数组的长度只有1
字符串数组
char **a; //a是一个指针,指向另一个指针,那个指针指向一个字符(串)
char a[][] ; //二维数组
char *a[] ; //a[0]相当于char *(一个指向一个字符串的指针),a[1],a[2]...同
单字符输入输出
putchar:从标准输出写一个字符,返回写了几个字符,EOF表示写失败
int putchar(int c);
getchar:从标准输入读一个字符,返回类型是int是为了返回EOF
int getchar(void);
C标准库string.h部分函数
strlen:
size_t strlen(const char *s);
返回s的字符串长度(不包括结尾的 \0 )
int mylen(const char *s ){
int cnt = 0;
while (s[cnt] != '\0') {
cnt++;
}
return idx;
}
//此函数与strlen功能相同(字符串结尾为\0—)
strcmp:
int strcmp(const char *s1, const char *s2);
比较两个字符串,返回:
0 : s1==s2
1 : s1>s2
-1: s1<s2
int mycmp( const char* s1,const char* s2){
int idx = 0;while ( 1 ) {
if ( s1[idx] != s2[idx] ) {
break;
}else if ( s1[idx] == '\0') {
break;
}
idx ++;
}
return (s1[idx] - s2 [idx]);
}
//此函数与strcmp功能相同(数组版)
int mycmp( const char* s1,const char* s2){
while (*s1 ==*s2 && *s1 != '\0') {
s1++;
s2++;
}
return (*s1 - *s2);
}
//此函数与strcmp功能相同(指针版)
strcpy
char * strcpy(char *restrict dst, const char *restrict src);
把src的字符串拷贝到dst(restrict表明src和dst地址无重叠)
返回dst(为了能链起代码来)
char *dst = (char*)malloc(strlen(src)+1);
strcpy(dst, src);
//复制一个字符串
char* mycpy( charx dst,const char* src){
int idx = 0;
while ( src[idx] != '\0') {
dst[idx] = src[idx];
idx++;
}
dst [idx] = '\0';
return dst;
}
//此函数与strcpy功能相同(数组版)
char* mycpy( charx dst,const char* src){
char* ret = dst;
while (*src != '\0') {
*dst =*src;
dst++;
src++;
}
*dst = '\0';
return ret;
}
//此函数与strcpy功能相同(指针版)
字符串中找单个字符
char * strchr(const char *s, int c); //返回从左数第一个字符(int c)的指针
char * strrchr(const char *s, int c); //返回从右数第一个字符的指针
//返回NULL表示没有找到
int main(int argc, char const *argv[]){
char s[] = "hello";
char *p = strchr(s,'l'); //返回'hello'中第一个'l'的指针
p = strchr(p+1,'l'); //返回'hello'中第二个'l'的指针
printf ( "%s\n", p);
return 0;
}
//找第二个字符的方法
char * strstr(const char *s1, const char *s2); //字符串中找字符串
char * strcasestr(const char *s1, const char *s2); //忽略大小写寻找字符串