#include<stdio.h> #include<stdlib.h> int strTime(const char *str1, const char *str2, int *time) { int count = 0; char *p1 = str1; char *p2 = str2; //p1是第一次出现的位置 p1 = strstr(p1, p2); //注意这里不要写成*p1!=NULL 由于p1 是null的地址一旦读取*p1 会出错的!!!!不能读取操作系统的数据 //千万不要写成 *p //while (*p1 != ' ') //while (p1 != NULL) while (p1) { count++; //让指针向后移动str2长度个位置 p1 = p1+strlen(str2); //找到下一次出现的位置 p1 = strstr(p1, p2); } *time = count; return 1; } //这里也能够实现出现次数的查询 /*int strTime(const char *str1, const char *str2, int *time) { char *p = NULL; int count = 0; char *sub = NULL; p = str1; sub = str2; do { p = strstr(p, sub); if (p != NULL) { count++; p = p + strlen(sub); } else { break; } } while (*p != ' '); *time = count; }*/ int getRes2(const char *str, const char *substr, int *time, char **buf2) { char *buf = (char *)malloc(strlen(str)*sizeof(char)); char *pbuf = buf; //进行字符串的替换 char *p = NULL; char *sub = NULL; p = str; sub = substr; int flag = 4; //仅仅要是不相等的情况下就将字符复制到buf中 char *point = "dcba"; while (*p != ' ') { if (*p != *sub) { *buf = *p; buf++; p++; //printf("%s ", pbuf); } //想等情况下也就是找到了须要替换的位置 else { for (int i = 0; i < flag; i++) { *buf = *point; buf++; point++; // printf("%s ", pbuf); } //控制4321循环 flag--; //这里须要将离开了"dcba"首地址的指针又一次定位回去 point = "dcba"; if (flag == 0) { flag = 4; } //相等的时候须要让p指针跨越四个字节也就是他下一次进行查找的位置 p += 4; } } //对末尾的加上字符串结束标志防止输出时乱码 *buf = ' '; //二级指针的典型使用方法 *buf2 = pbuf; } void main() { char *str1 = "abcd11111abcd2222abcdqqqqqabcd11111abcd2222abcdqqqqqabcd11111abcd2222abcdqqqqq"; char *str2 = "abcd"; int time = 0; //1求字符串"abcd"出现的次数 strTime(str1, str2, &time); printf("出现的次数是%d ", time); char *buf = NULL; //把字符串替换成(dcba11111dcb2222dqqqqqdd11111dcba.....) //注意特点逆序后,每次字符少一个,四次一循环; getRes2(str1, str2, &time, &buf); printf("原来的字符串 %s ", str1); printf("替换后的字符串 %s ", buf); system("pause"); }