第一周 指针与字符串
3.字符串操作
1.3.1单字符的输入输出
- putchar
- 函数原型:int putchar(int c);
- 向标准输出写一个字符
- 返回写了几个字符,EOF(-1)表示写失败
- getchar
- int getchar(void);
- 从标准输入读一个字符
- 返回类型是int是为了返回EOF(-1)
- windows ->Ctrl+Z
- UNIX ->Ctrl+D
笔记注释:
- EOF:End Of File (文件结束)
- 键盘(屏幕)<->shell<->程序
- shell:理解为一个巨大的缓冲区,我们输入的东西都是先缓存在shell中
- 按下回车时,缓冲区的数据送给程序进行处理(从shell中读取数据进行处理),再通过shell返回给屏幕显示
1.3.2字符串数据
- char a[ ] [ ]
- char *a[ ] 指针数组,每个指针指向一个字符串
- 程序参数
- int main(int argc, char const * argv[])
- argv[0]是命令本身
- int argc 代表argv数组的大小
用途:正在探索(busybox)
4.字符串函数的实现
#include <string.h>
1.4.1函数strlen
-
strlen
- size_t strlen(const char *s)
- 返回s的字符串长度(不包括结尾的0)
-
实现方法1
size_t mylen(const char *s) { int cnt = 0;//计数器 int idx = 0;//下标号 while(s[idx] != '\0'){ //到尾就停止 idx++;//遍历数组 cnt++; } return cnt;//返回长度不包括结尾的0 }
注释:知循环次数用for;不知循环次数用while定条件
-
实现方法2
size_t mylen(const char *s) { int cnt = 0;//计数器 // int idx = 0;//下标号 while(s[idx] != '\0'){ //到尾就停止 idx++;//遍历数组 // cnt++; } return cnt;//返回长度不包括结尾的0 }
注释:同样运行方式和结果的代码段可以不要
1.4.2函数strcmp
-
int strcmp(const char *s1, onst char *s2)
-
比较两个字符串,返回:
- 0:s1 == s2
- 1:s1 > s2
- -1: s1< s2
注释:s1与s2第一个不相同的字符的ASCII码的差值(s1-s2)
-
实现方法1
int mycmp(const char *s1, onst 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]; }
注释:退出循环的条件:两者均未结束,判断两者不相等;任意一者结束,直接跳出
-
实现方法2(数组下标实现遍历)
int mycmp(const char *s1, onst char *s2) { int idx = 0;//数组下标遍历 while (s1[idx] != s2[idx] && s1[idx] == '\0'){ idx ++; } return s1[idx] - s2[idx]; }
-
实现方法3(指针移动实现遍历)
int mycmp(const char *s1, onst char *s2)
{
while (*s1 != *s2 && *s1 == '\0'){
s1++;s2++;
}
return *s1 - *s2;
}
1.4.3函数strcpy
-
char *strcpy(char *restrict dst, char *restrict src)
- src 字符串 拷贝到 dst (包括末尾的’\0’)
- restrict 表明 src 和 dst 不重叠
- 返回dst
- 为了能链起代码
-
复制一个字符串
char *dst = (char*)malloc(strlen(src)+1);//加上末尾结束的'\0' strcpy(dst,src);
-
实现方法1(数组)
char *mycpy(char* dst, char* src) { int idx = 0; while (src[idx]) { dst[idx] = src[idx]; idx++; } dst[idx] = '\0';//补上末尾的\0 return dst; }
-
实现方法2(指针)
char *mycpy(char* dst, char* src) { char *ret = dst; while (*src) { *drc++ = *src++; } return ret; }
1.4.4字符串搜索函数
- 字符串中找字符
用途:
-
如何找第二个字符?
- 从找到第一个字符的位置+1再开始寻找
- 从找到第一个字符的位置+1再开始寻找
-
如何截取某个字符的前面一段字符串?
- 改变改字符的值为’\0’(截断),然后将整段字符串复制到另一个地方即可
- 原理:
- 字符串中找字符串
- char *strstr(const char *s1, const char *s2);
- char *strcasestr(const char *s1, const char *s2);//忽略大小写
注释:
- strchr自左往右搜索,strrchr自右向左搜索
- 返回指向该字符的指针