【1、问题描述】:
模拟实现strstr,在字符串str1的中查找是否包含字符串str2。
【解题思路】:
1、创建两个指针char* ptr1和char* ptr2分别指向str1和str2两个字符串的首位字符,再创建一个指针char* red_ptr1指向ptr1的位置。
2、当red_ptr1指向元素等于ptr2指向元素时,这两个指针一同往后移,前提是这两个指针指向的位置都不是\0。
3、如果ptr2指向\0时,说明str2已经遍历完了,在str1中找到了str2这个子串,返回ptr1的值。
4、如果red_ptr1指向元素不等于ptr2指向元素时,ptr1后移一位,ptr2回到首位置,red_ptr1回到ptr1的位置,重新比较。直到ptr1指向了\0,那么我们就可以得知str1中不包含str2。
【实现代码】
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* Strstr(const char* str1, const char* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
if (*str2 == '\0') {
return NULL;
}
char* ptr1 = str1;//记录从哪个位置找字符串子串
while (*ptr1 != '\0') {
char* red_ptr1 = ptr1;//用来完成具体的与str2中字符串的比较
char* ptr2 = str2;//完成具体的str2中字符比较过程
while (*red_ptr1 != '\0'&&*ptr2 != '\0'&&*red_ptr1 == *ptr2) {
++ptr2;
++red_ptr1;
}
if (*ptr2 == '\0') {
return ptr1;
}
if (*ptr2 != *red_ptr1) {
++ptr1;
}
}
if (*ptr1 == '\0') {
return NULL;
}
}
int main() {
char str1[] = "ababcde";
char str2[] = "abc";
//ret指向了str1中第一处str2子串的位置
char* ret = Strstr(str1, str2);
printf("%p\n", ret);
printf("%p\n", str1);
printf("%d\n", ret - str1);
system("pause");
return 0;
}
【运行结果】
【2、问题描述】
模拟实现strchr,在一个字符串中查找一个字符,并返回该字符在字符串中的位置。
【解题思路】
这个问题比较简单,遍历str中的所有字符,当与要查找字符相等时,返回相对应的下标即可。
【实现代码】
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
char* Strchr(const char* str, int character) {
assert(str != NULL);
for (; *str != '\0'; ++str) {
if (*str == (char)character)
return str;
}
if (*str == '\0') {
return NULL;
}
}
int main() {
char str[] = "hello world";
char* pch;
printf("查找'l'符号在字符串\%s中 \n", str);
pch = Strchr(str, 'l');
while (pch != NULL) {
printf("found at %d\n", pch - str + 1);
pch = Strchr((pch + 1), 'l');
}
system("pause");
return 0;
}
【运行结果】
【3、问题描述】
模拟实现strcmp,按字典序的方式比较两个字符串的大小。
【功能要求】
1、按字典序方式比较两个字符串大小。
2、若第一个字符串大于第二个字符串,返回1。第一个字符串等于第二个字符串,返回0,否则返回-1。
【实现代码】
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int Strcmp(const char* str1, const char* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
int i = 0;
for (; str1[i] != '\0'&&str2[i] != '\0'; ++i) {
if (str1[i] > str2[i]) {
return 1;
}
else if (str1[i] < str2[i]) {
return -1;
}
else if (str1[i] == str2[i]);//注意此时并没有比较完,不可以直接返回0,所以直接写一个;
}
if (str1[i] < str2[i]) {
return -1;
}
if (str1[i] > str2[i]) {
return 1;
}
else {
return 0;
}
}
int main() {
char str1[1024] = "abcd";
char str2[1024] = "bb";
int ret = Strcmp(str1, str2);
if (ret > 0) {
printf("str1>str2\n");
}
else if (ret < 0) {
printf("str1<str2\n");
}
else if (ret == 0) {
printf("str1=str2\n");
}
system("pause");
return 0;
}
【运行结果】