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

40 lines
2.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 设计函数,接收两个字符串,判断第二个字符串是否为第一个字符串的子符串。
// 【提示】第二个字符串的内容全部在第一个字符串中
#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 从当前比较位置的下一位开始比较
}
}