修正 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))
本文来自博客园,作者:caijianhong,转载请注明原文链接:https://www.cnblogs.com/caijianhong/p/18501985