当前位置: 首页 > news >正文

拼接 URL(C 语言)【字符串处理】

题目来自于博主算法大师的专栏:最新华为OD机试C卷+AB卷+OJ(C++JavaJSPy) 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

示例四

输入

,

输出

/

思路

解题思路如下:

  1. 读取输入:通过 fgets 函数从标准输入读取一行,该行包含 URL 前缀和后缀,中间用逗号分隔。同时确保移除换行符,使得字符串正确终止。

  2. 分割前后缀:使用 strchr 函数找到逗号的位置,并将逗号替换为终止符 \0,从而将输入的字符串分割成前缀(url1)和后缀(url2)两部分。

  3. 处理特殊情况

    • 检查前缀(url1)是否以 / 结尾,如果是,则去掉末尾的 /
    • 检查后缀(url2)是否以 / 开头,如果是,则去掉开头的 /。这里使用了 memmove 函数,因为它可以安全地在重叠内存区域中移动数据。
  4. 拼接 URL:根据题目要求,在前缀和后缀之间加上一个 / 符号,组成完整的 URL。

  5. 输出结果:最后,将处理后的完整 URL 输出到标准输出。

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int 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 确保了即使目标区域(str+7)与源区域(str)有重叠,“Hello” 这部分内容仍能正确地被移动并覆盖到原来 “World!” 后面。

http://www.lryc.cn/news/306110.html

相关文章:

  • 故障排除:Failed to load SQL Modules into database Cluster
  • 【超详细】HIVE 日期函数(当前日期、时间戳转换、前一天日期等)
  • [ffmpeg] x264 配置参数解析
  • GO语言基础总结
  • 飞天使-linux操作的一些技巧与知识点7-devops
  • Sora:视频生成模型作为世界模拟器
  • FairyGUI × Cocos Creator 3.x 使用方式
  • 基于Java的养生健康管理系统
  • Python课堂16——异常查找及处理
  • 任务书参考答案-模块1任务一
  • 2023最新盲盒交友脱单系统源码
  • Half-Band filter(半带滤波器)
  • 2024年环境安全科学、材料工程与制造国际学术会议(ESSMEM2024)
  • 常用路径规划算法简介及python程序
  • 计算x的对数math.log(x)math.log(x, a)math.log2(x)math.log10(x)
  • Golin 弱口令/漏洞/扫描/等保/基线核查的快速安全检查小工具
  • 【JavaEE】_HttpServlet类
  • 11-pytorch-使用自己的数据集测试
  • 数据安全之路:深入了解MySQL的行锁与表锁机制
  • 【深度学习】Pytorch 教程(十二):PyTorch数据结构:4、张量操作(3):张量修改操作(拆分、拓展、修改)
  • 适合新手博主站长使用的免费响应式WordPress博客主题JianYue
  • FPGA OSERDESE2
  • 如何卸载Erlang以及RabbitMQ
  • ros自定义action记录
  • 挑战30天学完Python:Day18 正则表达式
  • 力扣● 343. 整数拆分 ● 96.不同的二叉搜索树
  • 游戏同步+游戏中的网络模块
  • 【03】逆序数组
  • 基于Prony算法的系统参数辨识matlab仿真
  • 创建第一个React项目