修正 cin >> (str + 1)

c++20 删除了 cin >> (str + 1) 的写法,具体而言是删除了某个接受指针的非成员函数而改为接受 char (&s)[N] 一类的东西。为修正,我们可以写:

char s[100010];
ws(cin).getline(s + 1, sizeof s - 1);

以上方法只能整行读入。重点是将上一行的换行符通过 std::ws 吃掉。

若已知字符串长度,则可以

ws(cin).read(s + 1, n);

在某些编译器上(如 g++ (Ubuntu 13.2.0-23ubuntu4) 13.2.0)可以更加极端:

__istream_extract(cin, s + 1, 1e9);

但是不支持 C++20 的编译器很可能没有这个东西。而且我们也不需要。

我们也有极端的做法,以下代码可用

cin >> (char(&)[sizeof(s) / sizeof(s[0]) - 1])(*(s + 1));

std::size 可用时,等效于

cin >> (char(&)[size(s) - 1])(*(s + 1));

输入合法的时候没有事。但是低版本还是会缓冲区溢出,这就是删掉指针重载的原因。

但其实最为好笑的是 cout << (s + 1) 是可以的(调用到某个接受指针的非成员函数。)

当然,以上方法都尝试在读入时就做好移位,那么读入完再移位就好了嘛!

cin >> s;
memmove(s + 1, s, strlen(s) * sizeof(s[0]));

(sizeof s[0] 非必要,OI 范围内总为 1)
还有偷梁换柱也是可以的!不过要保证不访问 s[0]

char _s[10], *s = _s - 1;
cin >> _s;

更多神经病:

string str;
cin >> str;
char s[10];
copy_n(str.data(), str.size(), s + 1);

没有必要使用字符数组?

string str;
cin >> str;
str = ' ' + str;
// 或 str.insert(0, " "); (insert( size_type index, const CharT* s))
// 或 str.insert(0, 1, ' '); (insert(size_type index, size_type count, char ch))
posted @ 2024-10-25 10:43  caijianhong  阅读(28)  评论(0编辑  收藏  举报