帮做论文网站吗,辽源网站制作,沈阳营销型网站设计教程,海宁网站网站建设题目来自于博主算法大师的专栏#xff1a;最新华为OD机试C卷AB卷OJ#xff08;CJavaJSPy#xff09; https://blog.csdn.net/banxia_frontend/category_12225173.html
题目
给定一个 url 前缀和 url 后缀 通过,分割 需要将其连接为一个完整的 url 如果前缀结尾和后缀开头都…题目来自于博主算法大师的专栏最新华为OD机试C卷AB卷OJCJavaJSPy https://blog.csdn.net/banxia_frontend/category_12225173.html
题目
给定一个 url 前缀和 url 后缀 通过,分割 需要将其连接为一个完整的 url 如果前缀结尾和后缀开头都没有/ 需要自动补上/连接符 如果前缀结尾和后缀开头都为/ 需要自动去重 约束 不用考虑前后缀 URL 不合法情况
输入
url 前缀(一个长度小于 100 的字符串) url 后缀(一个长度小于 100 的字符串)
输出描述
拼接后的 url
示例一
输入
/acm,/bb输出
/acm/bb示例二
输入
/abc/,/bcd输出
/abc/bcd示例三
输入
/acd,bef输出
/acd/bef示例四
输入
,输出
/思路
解题思路如下 读取输入通过 fgets 函数从标准输入读取一行该行包含 URL 前缀和后缀中间用逗号分隔。同时确保移除换行符使得字符串正确终止。 分割前后缀使用 strchr 函数找到逗号的位置并将逗号替换为终止符 \0从而将输入的字符串分割成前缀url1和后缀url2两部分。 处理特殊情况 检查前缀url1是否以 / 结尾如果是则去掉末尾的 /。检查后缀url2是否以 / 开头如果是则去掉开头的 /。这里使用了 memmove 函数因为它可以安全地在重叠内存区域中移动数据。 拼接 URL根据题目要求在前缀和后缀之间加上一个 / 符号组成完整的 URL。 输出结果最后将处理后的完整 URL 输出到标准输出。
代码
#include stdio.h
#include stdlib.h
#include string.hint main() {// 定义存储 URL 前缀和后缀的字符数组char url1[100], url2[100];// 定义输入缓冲区假设两个URL和逗号总共不超过200个字符char input[201]; // 从标准输入读取一行包含前缀和后缀中间由逗号分隔fgets(input, 201, stdin); // 移除换行符确保字符串正确终止input[strcspn(input, \n)] \0;// 获取输入字符串长度int len strlen(input);// 查找并分割字符串在逗号处断开为前缀和后缀char *comma_pos strchr(input, ,);if (comma_pos ! NULL) {// 将逗号替换为终止符以分离前后缀*comma_pos \0; // 分别将前缀和后缀复制到各自的字符数组中strcpy(url1, input);strcpy(url2, comma_pos 1);}// 计算前缀和后缀的长度int len1 strlen(url1);int len2 strlen(url2);// 处理特殊情况如果前缀以 / 结尾则移除该 /if (len1 0 url1[len1 - 1] /) {url1[--len1] \0; // 将末尾的 / 替换为终止符}// 处理特殊情况如果后缀以 / 开头则将 / 向右移动一位if (len2 0 url2[0] /) {memmove(url2, url2 1, len2--); // 移除开头的 / 并调整字符串内容}// 拼接完整的 URL并打印输出printf(%s/%s\n, url1, url2);return 0;
}注意
1、memmove
memmove 是 C 语言标准库中的一个函数其主要作用是移动内存中的一段数据。这个函数可以安全地复制内存区域即使源内存区source和目标内存区destination有重叠部分也能正确处理。
函数原型通常定义如下
void* memmove(void* dest, const void* src, size_t n);dest指向目标内存区域的指针。src指向源内存区域的指针。n要移动的字节数。
当两个内存区域有重叠时如果直接使用 memcpy 函数可能会导致未复制或错误复制的数据因为 memcpy 不会考虑重叠情况它只是简单地从源到目标逐字节复制。而 memmove 则更加智能它在执行复制操作时会确保即便目标区域覆盖了源区域的部分内容也会先将这部分内容保存下来然后再复制过去从而保证了所有数据的完整性和正确性。
举例来说假设你有一个数组并想将其部分内容向左移动几个位置此时目标和源区域就会重叠这时就需要使用 memmove 而不是 memcpy。
以下是一个简单的用法示例
char str[] Hello, World!;
memmove(str 7, str, 6); // 移动前六个字符到七个字符的位置
str[13] \0; // 添加终止符确保字符串结束
// 此时 str 的内容变为 World!Hello在这个例子中memmove 确保了即使目标区域str7与源区域str有重叠“Hello” 这部分内容仍能正确地被移动并覆盖到原来 “World!” 后面。