diff --git a/day8/homework/h10.c b/day8/homework/h10.c new file mode 100644 index 0000000..c59be0b --- /dev/null +++ b/day8/homework/h10.c @@ -0,0 +1,40 @@ +// 设计函数my_strcmp(char *str1, char *str2) ,返回两个字符串匹配的结果。 +// 【提示】相同返回0,str1大于str2返回1,str2大于str1返回 - 1 +#include + +int my_strcmp(char *str1, char *str2); + +int main(void) +{ + char str1[] = "hello w"; + char str2[] = "hello s"; + printf("result = %d\n", my_strcmp(str1, str2)); // 0 + return 0; +} + +int my_strcmp(char *str1, char *str2) +{ + // 字符大小比较,使用 ASCII 码,例如:'a' > 'A','b' > 'a' + // 字符串比较大小的规则:从第一个字符开始比较,如果相同则比较下一个字符,直到有一个字符串到达末尾 + // 当一个字符串到达末尾时,如果另一个字符串还有字符,则另一个字符串大 + // 如果两个字符串都到达末尾,则两个字符串相同 + // 例如:str1 = "hello world",str2 = "hello",str1 > str2 + // 相同字符长度的字符串比较大小,比较的是字符串的字典序,例如:str1 = "hello",str2 = "world",str1 < str2 (h < w) + // 第一个字符串大于第二个字符串,返回 1 + while (*str1 && *str2) // 理解为:当 str1 和 str2 都不为 0 时,表示两个字符串都没有到达末尾 + { + if (*str1 > *str2) // 如果 str1 大于 str2 + return 1; // 返回 1 + else if (*str1 < *str2) // 如果 str1 小于 str2 + return -1; // 返回 -1 + str1++; // 指针向后移动一个字节 + str2++; // 指针向后移动一个字节 + } + // 如果 str1 和 str2 都到达了字符串的末尾,表示两个字符串相同 + if (!*str1 && *str2 == 0) // !*str1 相当于 *str1 == 0 + return 0; + if (*str1 == 0) // 如果 str1 到达了字符串的末尾,表示 str2 大于 str1 + return -1; + if (*str2 == 0) // 如果 str2 到达了字符串的末尾,表示 str1 大于 str2 + return 1; +} diff --git a/day8/homework/h3.c b/day8/homework/h3.c new file mode 100644 index 0000000..fa4ac87 --- /dev/null +++ b/day8/homework/h3.c @@ -0,0 +1,25 @@ +// 设计函数,接收一个数组和数组大小,返回数组中最大的元素。 【要求】函数的数组参数使用指针 +#include + +int max(int *arr, int size); // 声明函数 + +int main(void) +{ + int arr[] = {100, 23, 31, 48, 51, 6532, 7}; + int size = sizeof(arr) / sizeof(arr[0]); + printf("max = %d\n", max(arr, size)); + return 0; +} + +int max(int *arr, int size) +{ + int max = arr[0]; // 假设第一个元素最大 + for (int i = 1; i < size; i++) // 从第二个元素开始遍历 + { + if (arr[i] > max) // 如果当前元素大于max,则更新max + { + max = arr[i]; + } + } + return max; // 返回最大值 +} \ No newline at end of file diff --git a/day8/homework/h4.c b/day8/homework/h4.c new file mode 100644 index 0000000..9e94eb1 --- /dev/null +++ b/day8/homework/h4.c @@ -0,0 +1,30 @@ +// 设计函数,接收一个字符串,返回这个字符串的逆向内容。 +#include +#include // 使用 strlen() 函数,获取字符串长度 + +void reverse(char *str); + +int main(void) +{ + char str[] = "hello world"; + reverse(str); + printf("%s\n", str); + return 0; +} + +void reverse(char *str) // 传入的是指针,直接修改原字符串 +{ + int len = strlen(str); // 获取字符串长度 + // for (int i = 0; i < len / 2; i++) // 交换前后两个字符,使用二分法 + for (int i = 0; i < len >> 1; i++) // len >> 1 相当于 len / 2 + { + // char temp = str[i]; + // str[i] = str[len - 1 - i]; + // str[len - 1 - i] = temp; + + // 交换前后两个字符,使用异或法 + str[i] ^= str[len - 1 - i]; + str[len - 1 - i] ^= str[i]; + str[i] ^= str[len - 1 - i]; + } +} \ No newline at end of file diff --git a/day8/homework/h5.c b/day8/homework/h5.c new file mode 100644 index 0000000..00be748 --- /dev/null +++ b/day8/homework/h5.c @@ -0,0 +1,40 @@ +// 设计函数,接收两个字符串,判断第二个字符串是否为第一个字符串的子符串。 +// 【提示】第二个字符串的内容全部在第一个字符串中 +#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 从当前比较位置的下一位开始比较 + } +} \ No newline at end of file diff --git a/day8/homework/h6.c b/day8/homework/h6.c new file mode 100644 index 0000000..3a2cb29 --- /dev/null +++ b/day8/homework/h6.c @@ -0,0 +1,18 @@ +// 给定一个long类型的变量,赋值0x010203040506, 请按单字节方式输出这个变量的数值。 +#include + +int main() +{ + long m = 0x010203040506; + char *p = (char *)&m; + printf("sizeof(long) = %lu\n", sizeof(long)); // 8 + printf("sizeof(char) = %lu\n", sizeof(char)); // 1 + + while (*p) // 当指针指向的值为 0 时,表示已经到达 long 类型变量的末尾 + { + printf("%x ", *p); // 输出指针指向的值 + p++; // 指针向后移动一个字节 + } + printf("\n"); + return 0; +} \ No newline at end of file diff --git a/day8/homework/h9.c b/day8/homework/h9.c new file mode 100644 index 0000000..1acef25 --- /dev/null +++ b/day8/homework/h9.c @@ -0,0 +1,20 @@ +// 设计函数my_strlen(char *str),返回str字符串的长度 +#include + +int my_strlen(char *str); + +int main(void) +{ + char str[] = "hello world"; + printf("len = %d\n", my_strlen(str)); + return 0; +} + +int my_strlen(char *str) +{ + int len = 0; + while (*str++) // 当指针指向的值为 0 (ASCII 为空字符串,判断字符串结束)时,表示已经到达字符串的末尾 + len++; + + return len; +} \ No newline at end of file