day8 homework: 库文件的生成和使用 && 指针的应用
This commit is contained in:
parent
ee8b203991
commit
dc271c0212
|
@ -0,0 +1,40 @@
|
||||||
|
// 设计函数my_strcmp(char *str1, char *str2) ,返回两个字符串匹配的结果。
|
||||||
|
// 【提示】相同返回0,str1大于str2返回1,str2大于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;
|
||||||
|
}
|
|
@ -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; // 返回最大值
|
||||||
|
}
|
|
@ -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];
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 从当前比较位置的下一位开始比较
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue