字符串查找、错误信息、字符分类函数
1、寻找子串strstr
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* cp = str1;
const char* s1 = str1;
const char* s2 = str2;
while (*cp)
{
s2 = str2;
s1 = cp;
while (*s1!=' ' && *s2!=' ' && * s1 == *s2)
{
s1++;
s2++;
}
if (*s2 == ' ')
{
return cp;
}
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "abbbcdef";
char arr2[] = "bbc";
char *ret=my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("不是子串n");
}
else
{
printf("%sn", ret);
}
}
用cp标记每次查找的起始位置,s1每次从cp开始,s2从str2开始*s1==' '即找不到,*s2==' '即找到。cp为 即在str1中无法找到子串。
2、字符串切割strtok
1、每调用一次,在需要切割的函数里找 作为分隔符的任一字符,找到后置为
2、第一次调用,需要传入这个字符串作为扫描的起始位置。完成调用,置为 的位置会被记录,下次自动从 的后一个位置开始扫描,因此后续调用传入NULL即可。
3、调用如果找到str的 ,本次调用还返回之前 +1,但是后续所有的调用返回的都是NULL
利用while循环实现,循环前要先调用并打印一次。
巧妙利用for循环可以实现唯一一次初始化的特点,契合strtok函数的特点。
注意:strtok函数中涉及到对 位置的标记和保存,在函数中保存而能在函数外使用,说明这个保存的指针类型应该用static关键字来修饰,即将这个变量附加一个静态属性,让它在函数外仍不被销毁,从而保存修改的 的位置,进而下次使用strtok函数时直接调用。
同时,arr2字符串是一个常量字符串,内存是不可被改变的。第一个参数虽然可以传指针,但我们要考虑空间内存布局,用delim替换 改变原字符串时,用指针指向这个字符串时,实际上指向的是字符串常量。
此处引用博主 Shemesz 提供的Linux下进程的内存布局图。
#include<string.h>
#include<stdio.h>
#include<assert.h>
char* my_strtok(char* str, const char* delim)
{
static char* next_start = NULL;
if (next_start != NULL)
{
str = next_start;
}
if(str==NULL && next_start == NULL)
{
return NULL;
}
char* s = str;
const char* t = NULL;
while (*s)
{
t = delim;
while (*t)
{
if (*s == *t)
{
next_start = s + 1;
if (s == str)
{
str = next_start;
break;
}
else
{
*s = ' ';
return str;
}
}
else
{
t++;
}
}
s++;
}
next_start = NULL;
return str;
}
int main()
{
char arr1[] = "123456@qq.com";
char arr2[] = "@.";
char* ch = NULL;
for (ch = my_strtok(arr1, arr2); ch != NULL; ch = my_strtok(NULL, arr2))
{
printf("%sn", ch);
}
}
'原码实现。其中两个循环内部与strstr函数寻找子串并返回找到的地址相似。
两个循环走完后都没有返回,说明已经查找不到要切割的字符,因此返回最后一部分字符串。
再次调用my_strtok函数,经判断后返回NULL。
3、错误信息翻译官strerror
C语言的库函数在运行时如果发生一些错误,就会将错误码存放在一个全局变量errno中。错误码是一些数字,我们可以用strerror将错误码“翻译”成错误信息。
0 没有错误
1 操作不被允许,没有权限
2 没有文件或文件夹
3 没有这个进程
4 函数调用被中断
5 输入输出错误
以上是几个错误码对应错误信息的例子。但实际上,程序产生错误后把错误码存入errno中,我们可以直接打印errno。
前面调用库函数失败后,errno内的值更新为刚刚的错误码,然后才能被strerror翻译出来。
4、翻译并打印perror
在打印错误信息前,先打印你自定义的信息。
perror可认为是printf+strerror
当我们想打印错误信息时使用perror更方便,但是不想打印时就要使用strerror了。
头文件是stdio.h也是输出 使用errno 包含 errno.h strerror是string.h
5、字符分类/判断/转换函数
1、分类、判断 iscntrl任何控制字符isspace空白字符:空格‘ ’,换页‘f’,换行'n',回车‘r’,制表符't'或者垂直制表符'v'isdigit十进制数字 0~9isxdigit十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~Fislower小写字母a~zisupper大写字母A~Zisalpha字母a~z或A~Zisalnum字母或者数字,a~z,A~Z,0~9ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)isgraph任何图形字符isprint任何可打印字符,包括图形字符和空白字符本质上内存中存的是字符的ASCLL码值,通过传入字符或其ASCLL码值判断是不是相应字符。
例如,islower判断是否是小写字母。返回int 0则不是,非0则是。
这一类函数本质上是相同的,可以灵活使用,忘记了就可以查一下再熟悉。
3、转换tolower toupper
传入小写字符/或其ASCLL,返回其大写的字符/ASCLL
int main()
{
char arr[] = "I Have An Apple";
int i = 0;
while (arr[i])
{
if (isupper(arr[i]))
{
printf("%c", tolower(arr[i]));
}
else
{
printf("%c", arr[i]);
}
++i;
}char arr[] = "I Have An Apple";
while (arr[i])
{
if (isupper(arr[i]))
{
arr[i] = tolower(arr[i]);
}
printf("%c", arr[i]);
++i;
}
return 0;
}
以上都是针对字符的函数。
相关知识
作业打卡 设置密码 &水仙花数& 查找字符串
2021年1月学考选考技术知识点之字符串问题
如何在JavaScript中按字符和新集合拆分列表?
关于Visual Studio编程时出现 “0xFEFEFEFE 处有未经处理的异常(在 查找学生信息.exe 中): 0xC00001A5: 检测到无效的异常处理程序例程。“解决方案
Wireshark搜索/查找字符串失败
字符串
工作碰上的技术问题及处理经验
c++ TCHAR转string导致中文缺失或乱码问题及解决
搜索
以下函数( )不能用于过滤字符串空格的?
网址: 字符串查找、错误信息、字符分类函数 https://www.huajiangbk.com/newsview104986.html
上一篇: 闫雅雯 副教授 |
下一篇: 下列关于银杏的描述哪些是正确的。 |
推荐分享

- 1君子兰什么品种最名贵 十大名 4012
- 2世界上最名贵的10种兰花图片 3364
- 3花圈挽联怎么写? 3286
- 4迷信说家里不能放假花 家里摆 1878
- 5香山红叶什么时候红 1493
- 6花的意思,花的解释,花的拼音 1210
- 7教师节送什么花最合适 1167
- 8勿忘我花图片 1103
- 9橄榄枝的象征意义 1093
- 10洛阳的市花 1039