qfedu-c-level/day8/homework/h5.c

40 lines
2.1 KiB
C
Raw Normal View History

// 设计函数,接收两个字符串,判断第二个字符串是否为第一个字符串的子符串。
// 【提示】第二个字符串的内容全部在第一个字符串中
#include <stdio.h>
int is_substring(char *str1, char *str2);
int main(void)
{
char *str1 = "hello world";
char *str2 = "wdorld";
int result = is_substring(str1, str2);
char *res = result ? "" : "不是";
printf("\"%s\" %s \"%s\" 的子串", str2, res, str1);
return 0;
}
int is_substring(char *str1, char *str2)
{
// 从第一个字符串的第一个字符开始,依次和第二个字符串的第一个字符比较
// 如果相同,则比较第一个字符串的第二个字符和第二个字符串的第二个字符
// 如果不同,则比较第一个字符串的第二个字符和第二个字符串的第一个字符
if (!*str1 || !*str2) // 如果第一个字符串或第二个字符串为空字符串,则返回 0
return 0;
while (*str1) // 当第一个字符串不为空字符串时
{
// 使用临时指针变量,避免修改原始指针变量的值,下一轮还需要重新回归 str2 的起始位置
char *p1 = str1; // 保存第一个字符串的地址
char *p2 = str2; // 保存第二个字符串的地址
while (*p1 && *p2) // 当第一个字符串和第二个字符串都不为空字符串时
{
if (*p1 != *p2) // 如果第一个字符串和第二个字符串的字符不相同
break; // 退出内层循环,接下来判断第二个字符串是否结束,如果结束,则表示第二个字符串是第一个字符串的子串
p1++; // 第一个字符串的指针向后移动一个字节
p2++; // 第二个字符串的指针向后移动一个字节
}
if (!*p2) // 如果第二个字符串为空字符串,表示第二个字符串是第一个字符串的子串
return 1;
str1++; // 第一个字符串的指针向后移动一个字节,下一次 str2 从地址开始位置从新开始比较str1 从当前比较位置的下一位开始比较
}
}