Skip to content

1349: Cstring Implement I

题目

题目描述

题目背景

C语言拥有丰富的字符串处理API。它们中的大部分实现在 <string.h> 头文件中,而且大部分实现较为简洁。当然C++继承了这一套函数库——它们被放进了 <cstring> 头文件,并且包裹在 std 命名空间中。

为了让你熟练使用 <cstring> ,顺便练习一下字符数组的使用方法,助教决定让你实现一下这个库!(里的一部分函数)

请注意,Cstring Implement系列题目中的函数往往与标准库中所描述的有所不同。请认真阅读题面中的描述后再实现。

题目描述

这是一道头文件题目。你要实现给定的两个函数,并把头文件提交到OJ上。在头文件中不允许使用任何标准库。

本题的下发文件可以从 SJTU JBOX 下载。src.hpp为你需要实现的头文件;main.cpp为评测所用的主程序。

在本题中,你需要实现 strcmpstrcpy 两个函数,它们的定义如下。(下面函数的文档使用了工具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了,可以的话,请您参考添加页面,与大家一起分享你的题解!