#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 != '\0')
//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 != '\0');
*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 != '\0')
{
if (*p != *sub)
{
*buf = *p;
buf++;
p++;
//printf("%s\n", pbuf);
}
//想等情況下也就是找到了須要替換的位置
else
{
for (int i = 0; i < flag; i++)
{
*buf = *point;
buf++;
point++;
// printf("%s\n", pbuf);
}
//控制4321迴圈
flag--;
//這裡須要將離開了"dcba"首地址的指標又一次定位回去
point = "dcba";
if (flag == 0)
{
flag = 4;
}
//相等的時候須要讓p指標跨越四個位元組也就是他下一次進行查詢的位置
p += 4;
}
}
//對末尾的加上字串結束標誌防止輸出時亂碼
*buf = '\0';
//二級指標的典型使用方法
*buf2 = pbuf;
}
void main()
{
char *str1 = "abcd11111abcd2222abcdqqqqqabcd11111abcd2222abcdqqqqqabcd11111abcd2222abcdqqqqq";
char *str2 = "abcd";
int time = 0;
//1求字串"abcd"出現的次數
strTime(str1, str2, &time);
printf("出現的次數是%d\n", time);
char *buf = NULL;
//把字串替換成(dcba11111dcb2222dqqqqqdd11111dcba.....)
//注意特點逆序後,每次字元少一個,四次一迴圈;
getRes2(str1, str2, &time, &buf);
printf("原來的字串 %s\n", str1);
printf("替換後的字串 %s\n", buf);
system("pause");
}