char [ ] = {'H','e','l','l','o','!'}; 是字符数组 不是字符串 不能用字符串的方式做运算
char [ ] = {'h','e','l','l','o','!','\0'};
字符串是以0结尾的一串字符
0标志着字符串的结束 但不是字符串的一部分
计算字符串长度的时候不包括0
字符串以数组的形式存在(不能用运算符对字符串做运算,可以通过数组的方式遍历字符串) ,以数组或指针的方式访问 (更多是以指针的方式)
函数string.h
"Hello" 由双引号扩起来 叫做字符串常量
字符串变量的定义
1 char *str = "Hello"; 指针指向一个字符数组
2 char word[] = "Hello";
3 char line [10] = "Hello";
字符串变量
char* s = "Hello world!";
s[0] = 'B'; 结果错误
char* s = "Hello world!";
char* s2 = "Hello world!"; 两者prinrf得到的值相同 两个指针指向相同的地址 由于常量所在的地方 s实际上是const char*s
选择指针还是数组:
数组:字符串在这里 作为本地变量空间自动回收
指针:不知道字符串在哪 通常用来处理参数 动态分配空间(malloc)
如果要构造一个字符串 用数组 处理一个字符串 用指针
字符串的输入输出
char* string[ ]; 易错:只定义了一个指针变量 没有初始化值 容易出错 应使初始值为0
scanf("%s",string); scanf读人一个单词 直到遇到空格 tab 回车 scanf不知道读入内容的长度 应该scanf("%数字s",string) 数字表示读取内容的长度 到固定长度不再读取 即不根据回车空格判断
printf("%s",string);
空字符串
char buffer[100] = " "; buffer[0] == '\0'
char buffer[ ]=" "; 该数组长度只有1
字符串数组和指针数组
char a[ ] [10] 和 char* a[ ] 的区别 前者是创建二维数组 每一行一列字符串 后者是一维指针数组 每一个指针指向一个字符串
字符串数组和main函数
int main( int argc, char const* argc[ ] ) 前面的整数告诉后面的字符串数组有多大 argc[0] 是字符串本身
单字符输入输出
int putchar(int c) 向标准输出写入一个字符 返回写了几个字符
int getchar (void) 从标准输入读入一个字符 int是为了返回EOF(-1) ctrl+z
SHELL的作用
行编辑 在键盘上输入的内容还没按enter前 都放在shell里
字符串函数 #include<string.h>
strlen 返回字符串长度
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空间里 src和dst不重叠
char* dst = (char*) (强制类型转换)malloc( strlen(src)+1 ); (读取字符串长度+1 \0)
strcpy(dst,src);
数组版本:
char* mycpy(char* dst, char*src){
int idx = 0;
while (src [ idx ] ){
dst [ idx ] = src [ idx ];
idx++;
}
dst [ idx ] = ' \0 ';
return dst;
}
char* ret = dst;
while ( *src != '\0'){ 简化 while( *src ) 最终版本 while (*dst++ = *src++ )
*dst = *src; *dst++ = *src++;
dst ++;
src ++;
}
return ret;
strcat
strchr
strstr