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