我正在尝试实现一个函数,该函数从当前索引所在的字符串中删除字符。以下是我到目前为止所拥有的骨架。我正在尝试将要删除的字符旋转到字符串的末尾,然后将其替换为空终止符。我在下面的代码似乎并没有真正旋转缓冲区,因为我得到的输出是"wor"而不是预期的输出"wrd"。
int main() {
char buffer[]="word";
int currIndex=2;
int endIndex=strlen(buffer);
currIndex--;
endIndex--;
rotate(buffer+currIndex,
buffer+1,
buffer+strlen(buffer));
buffer[endIndex]=' ';
cout << buffer << endl;
return 0;
}
这并不试图回答所提出的问题,而是解决根本问题:从字符串中删除单个字符。
解决方案是 std::string::erase 类成员的简单应用:
#include <string>
#include <iostream>
int main() {
std::string word{ "word" };
std::string::size_type currIndex{ 2 };
word.erase( currIndex, 1 );
std::cout << word << std::endl;
}
使用 std::string 使事情变得更容易,因为我不必考虑指针:
std::string buffer="word";
rotate(buffer.begin()+1, buffer.begin()+2, buffer.end());
buffer.resize(buffer.size()-1);
演示
或者,我们可以坚持使用 c 样式数组:
char buffer[]="word";
rotate(buffer+1, buffer+2, buffer+4);
buffer[3] = ' ';
演示2
std::rotate
接受 3 个参数:
template< class ForwardIt >
ForwardIt rotate( ForwardIt first, ForwardIt n_first, ForwardIt last );
first
是要左旋转的范围内的第一个元素。
nfirst
是旋转后您希望位于范围开头的元素(这告诉算法有效地向左旋转多少次(
last
是要旋转的范围内的最后一个元素。
您的代码:
char buffer[]="word";
int currIndex=2;
int endIndex=strlen(buffer);
currIndex--;
endIndex--;
rotate(buffer+currIndex,
buffer+1,
buffer+strlen(buffer));
buffer[endIndex]=' ';
实际上真的很接近。你只是弄错了第二个论点。它应该是
rotate(buffer+currIndex,
buffer+2,
buffer+strlen(buffer));
buffer[endIndex]=' ';
但不可否认,代码在增量和递减方面有点混乱。