Skip to content

1351: Cstring Implement III

题目

题目描述

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

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

在本题中,你需要实现 strtok 一个函数,该函数严格等同于标准库中的 std::strtok 函数。它的定义如下:

C++ /** * @brief split STRing by TOKen:以delim为分隔符,分隔字符串str。 * @param str 源字符串 * @param delim 一个字符串,其中每一个字符都被当成一种分隔符 * @return 返回分割得到的第一个字符串。 * @par 具体来说,strtok会找到字符串中delim中字符第一次出现的位置, * 然后把这个位置的字符修改为'\0',然后返回原字符串。 * 为了支持多次分隔,可以在str参数中传入空指针, * 那么函数的返回值是上一次调用的“原串”以delim分隔得到的第二部分, * 若再次调用则为第三部分,以此类推。 */ char *strtok( char * __restrict str, const char * __restrict delim );

阅读文档对于标准库函数的使用是极其重要的。请查阅下面的链接,获得strtok的严谨定义。

请参考 https://zh.cppreference.com/w/c/string/byte/strtok 中 1)的全部内容。
(P.S. 助教在出这道题的时候甚至还修了cppreference上的一个错误)

为了便于理解这个函数,我们介绍一下strtok函数的典型使用方式:

```C++ //output: //text abc // def // ghi int main () { char str[] = "text abc - def - ghi"; const char s[] = "-"; char *token;

/* 获取第一个子字符串 */
token = strtok(str, s);

/* 继续获取其他的子字符串 */
while( token != nullptr ) {
    cout << token << endl;
    token = strtok(nullptr, s);
}

return 0;

}

```

strtok的缺点是会破坏原串。因此,使用它的时候请确保原串不会在调用后被再次用到;或者,也可以复制一个新串作为strtok的参数。

另外,为了实现传入nullptr多次分隔的特性,你可能会需要一些函数内的静态变量。

不需要考虑str和delim有重叠的情况。

输入格式

第一行输入 $n$,表示操作数

接下来 $n$ 行,每行一个操作。操作形如:

  • 1 s1 s2 表示需要做一次 strtok(s1, s2) 和多次 strtok(nullptr, s2),直至把字符串分割完成。

输出格式

评测程序会输出函数的返回值。

strtok可能会有多次调用,我们会每行输出一个返回值。

样例输入

text 2 1 abcdefaedd abd 1 textabcwdefwghi w

样例输出

text c ef e textabc def ghi

数据范围

所有的字符串都是小写英文字母构成的。

保证输入的字符串总长度小于等于 $10^6$。

Oops! 本题目还没有解答!

助教老师们编题的速度,已经超过了解题的速度!

OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。

如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!