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