day8 homework: 库文件的生成和使用 && 指针的应用

This commit is contained in:
flykhan 2023-07-13 09:29:01 +08:00
parent ee8b203991
commit dc271c0212
6 changed files with 173 additions and 0 deletions

40
day8/homework/h10.c Normal file
View File

@ -0,0 +1,40 @@
// 设计函数my_strcmp(char *str1, char *str2) ,返回两个字符串匹配的结果。
// 【提示】相同返回0str1大于str2返回1str2大于str1返回 - 1
#include <stdio.h>
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;
}

25
day8/homework/h3.c Normal file
View File

@ -0,0 +1,25 @@
// 设计函数,接收一个数组和数组大小,返回数组中最大的元素。 【要求】函数的数组参数使用指针
#include <stdio.h>
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; // 返回最大值
}

30
day8/homework/h4.c Normal file
View File

@ -0,0 +1,30 @@
// 设计函数,接收一个字符串,返回这个字符串的逆向内容。
#include <stdio.h>
#include <string.h> // 使用 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];
}
}

40
day8/homework/h5.c Normal file
View File

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

18
day8/homework/h6.c Normal file
View File

@ -0,0 +1,18 @@
// 给定一个long类型的变量赋值0x010203040506, 请按单字节方式输出这个变量的数值。
#include <stdio.h>
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;
}

20
day8/homework/h9.c Normal file
View File

@ -0,0 +1,20 @@
// 设计函数my_strlen(char *str)返回str字符串的长度
#include <stdio.h>
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;
}