1349: Cstring Implement I
题目
题目描述
题目背景
C语言拥有丰富的字符串处理API。它们中的大部分实现在
<string.h>
头文件中,而且大部分实现较为简洁。当然C++继承了这一套函数库——它们被放进了<cstring>
头文件,并且包裹在std
命名空间中。为了让你熟练使用
<cstring>
,顺便练习一下字符数组的使用方法,助教决定让你实现一下这个库!(里的一部分函数)
请注意,Cstring Implement系列题目中的函数往往与标准库中所描述的有所不同。请认真阅读题面中的描述后再实现。
题目描述
这是一道头文件题目。你要实现给定的两个函数,并把头文件提交到OJ上。在头文件中不允许使用任何标准库。
本题的下发文件可以从 SJTU JBOX 下载。src.hpp
为你需要实现的头文件;main.cpp
为评测所用的主程序。
在本题中,你需要实现 strcmp
和 strcpy
两个函数,它们的定义如下。(下面函数的文档使用了工具Doxygen的语法)
C++
/**
* @brief 比较两个字符串
* @param s1 一个字符串
* @param s2 一个字符串
* @return 按字典序比较字符串。如果s1 < s2,返回 -1; 如果s1 == s2, 返回 0;如果s1 > s2,返回1。
*/
int strcmp(const char *s1, const char *s2);
C++
/**
* @brief 复制src字符串到dest
* @param dest 目标字符串
* @param src 源字符串
* @return 返回dest指针
* @par 关键字__restrict的作用是要求传入的dest和src之间没有重叠,具体可以参考<https://en.cppreference.com/w/c/language/restrict>
* 在本题中,如果复制会导致dest与src有重叠(dest在前,src在后;或者src在前,dest在后),请什么都不做,然后返回dest。这点与标准库中不同。
*/
char* strcpy(char * __restrict dest, const char * __restrict src);
思考题:
如果src的长度大于dest能存储的范围,那么strcpy还是安全的吗?
由此看来,C风格的字符串处理函数有什么缺陷?有什么办法可以避免这一缺陷?
输入格式
第一行输入 $n$,表示操作数
接下来 $n$ 行,每行一个操作。操作有以下两种:
1 s1 s2
表示需要做strcmp(s1, s2);
2 s1
表示需要做strcpy(char[], s1);
3 s1
表示做strcpy(char[], s1);
,且dest在src之前,复制会导致它们重叠;4 s1
表示做strcpy(char[], s1);
,且dest在src之后,它们之间有重叠。
具体请参阅main.cpp
。
输出格式
评测程序会输出函数的返回值。
- 如果是
strcmp(s1, s2);
,输出它的返回值——也就是比较大小的结果; - 如果是
strcpy(char[], s1);
,输出它的返回值——也就是dest字符串的值。
样例输入
text
8
1 aaa aab
1 aaa aa
1 bbb bbb
1 aa bbb
2 werewrqwrewrqrwqerqwr
2 flaksjflksdjfjfldsjkf
3 abcdef
4 abcdef
样例输出
text
-1
1
0
-1
werewrqwrewrqrwqerqwr
flaksjflksdjfjfldsjkf
w
def
数据范围
所有的字符串都是小写英文字母构成的。
保证输入的字符串总长度小于等于 $10^7$。
Cstring Implement系列的三道题不需要考虑复杂度问题,你只需要关注实现的正确性即可。
Oops! 本题目还没有解答!
助教老师们编题的速度,已经超过了解题的速度!
OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。
如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!